Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сформировать матрицу значений и вставить в таблицу  [new]
vso
Member

Откуда: СПб
Сообщений: 270
Всем доброго времени суток!

Мне необходимо в третьей таблице связать значения из двух других. Поясню:

в процедуру передается два табличных значения

T1 - Список значений с каждым из которого надо сопоставит значения T2
ID
1
2
3


T2 - Список значений которые сопоставляются
ID
1
2
3
4


Причем в T2 может быть как одно значение, так и несколько. Т.е. связи могут быть как один-к-одному, так и один-ко-многим.
На основе примеров выше должно получится следующее.
T3
ID SRC DST
1 1 1
2 1 2
3 1 3
4 1 4
5 2 1
6 2 2
7 2 3
8 2 4
9 3 1
10 3 2
11 3 3
12 3 4


Может кто подскажет, как сформировать такую матрицу на основе входящих табличных значений и вставить ее в таблицу?
11 ноя 14, 08:42    [16826039]     Ответить | Цитировать Сообщить модератору
 Re: Сформировать матрицу значений и вставить в таблицу  [new]
Glory
Member

Откуда:
Сообщений: 104751
Вы спрашиваете про CROSS JOIN что ли ?
11 ноя 14, 09:06    [16826078]     Ответить | Цитировать Сообщить модератору
 Re: Сформировать матрицу значений и вставить в таблицу  [new]
Klemzig
Guest
Веткин Сергей,

insert into T3(...)
select * from T1 cross join T2;
11 ноя 14, 09:06    [16826082]     Ответить | Цитировать Сообщить модератору
 Re: Сформировать матрицу значений и вставить в таблицу  [new]
vso
Member

Откуда: СПб
Сообщений: 270
Спасибо огромное!!!!!!!!!!!!

как все оказалось просто, не зря мне казалось что вопрос решается просто...

P.S. До сих пор не мог понять зачем нужен этот CROSS
11 ноя 14, 09:27    [16826150]     Ответить | Цитировать Сообщить модератору
 Re: Сформировать матрицу значений и вставить в таблицу  [new]
vso
Member

Откуда: СПб
Сообщений: 270
Продолжу здесь, т.к. проблема выросла из этой реализации.

Когда я это реализовал пришло понимание что будут ситуации не только на вставку, но и на изменение существующих данных.

Тогда я переделал запрос на следующий:
  MERGE T3 AS TARGET
  USING (SELECT s.Id,
                d.Id
         FROM @Src s
           CROSS JOIN @Dst d) AS SOURCE (ID_SRC, ID_DST)
  ON SOURCE.ID_DST = TARGET.Ref_Detail
  WHEN MATCHED THEN
    UPDATE
    SET SRC = SOURCE.ID_SRC
  WHEN NOT MATCHED THEN
    INSERT (SRC, DST)
      VALUES (ID_SRC, ID_DST);


После чего пришло понимание что может быть и такой случай:

Скажем в таблице T3 есть такие значения
ID SRC DST
15 8 12
16 8 24


Теперь представим, что какие то исходные данные изменились и нам надо изменить даные, то с использованием запроса выше
получится следующее:
ID SRC DST
15 8 5
16 8 5


а должно получится так:
ID SRC DST
15 8 5


Подскажите как избежать дублирования?
11 ноя 14, 19:10    [16830738]     Ответить | Цитировать Сообщить модератору
 Re: Сформировать матрицу значений и вставить в таблицу  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Веткин Сергей
Продолжу здесь, т.к. проблема выросла из этой реализации.

Когда я это реализовал пришло понимание что будут ситуации не только на вставку, но и на изменение существующих данных.

Тогда я переделал запрос на следующий:

После чего пришло понимание что может быть и такой случай:

Скажем в таблице T3 есть такие значения
ID SRC DST
15 8 12
16 8 24


Теперь представим, что какие то исходные данные изменились и нам надо изменить даные, то с использованием запроса выше
получится следующее:
ID SRC DST
15 8 5
16 8 5


а должно получится так:
ID SRC DST
15 8 5


Подскажите как избежать дублирования?


Смешной вы, сначала cross join юзаете, а потом избежать дублирования хотите:)
Если по теме, то вот вопрос на засыпку, откуда должно получится?
ID SRC DST
15 8 5

и почему не?

ID SRC DST
16 8 5
11 ноя 14, 19:16    [16830784]     Ответить | Цитировать Сообщить модератору
 Re: Сформировать матрицу значений и вставить в таблицу  [new]
vso
Member

Откуда: СПб
Сообщений: 270
WarAnt,

ID оставил от болды. Какая из этих записей останится не принципиально
11 ноя 14, 19:19    [16830794]     Ответить | Цитировать Сообщить модератору
 Re: Сформировать матрицу значений и вставить в таблицу  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Веткин Сергей
WarAnt,

ID оставил от болды. Какая из этих записей останится не принципиально


тогда почему принципиально чтобы осталась одна, а не две?
11 ноя 14, 19:26    [16830828]     Ответить | Цитировать Сообщить модератору
 Re: Сформировать матрицу значений и вставить в таблицу  [new]
vso
Member

Откуда: СПб
Сообщений: 270
WarAnt, потому что конечный пользователь в таком случае увидит

Номер комплекта л.л. 7,7

а должен

Номер комплекта л.л. 7
11 ноя 14, 19:29    [16830849]     Ответить | Цитировать Сообщить модератору
 Re: Сформировать матрицу значений и вставить в таблицу  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Веткин Сергей
WarAnt, потому что конечный пользователь в таком случае увидит

Номер комплекта л.л. 7,7

а должен

Номер комплекта л.л. 7


дак выводите конечному пользователю через distinct
11 ноя 14, 19:30    [16830855]     Ответить | Цитировать Сообщить модератору
 Re: Сформировать матрицу значений и вставить в таблицу  [new]
vso
Member

Откуда: СПб
Сообщений: 270
WarAnt, да я нашел возможность вставить Distinct и так конечно пользователь видит что нужно.

Но на сколько правильно оставлять дубли?
11 ноя 14, 20:07    [16831017]     Ответить | Цитировать Сообщить модератору
 Re: Сформировать матрицу значений и вставить в таблицу  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Веткин Сергей
WarAnt, да я нашел возможность вставить Distinct и так конечно пользователь видит что нужно.

Но на сколько правильно оставлять дубли?


Настолько же на сколько использовать декартово произведение:)
12 ноя 14, 10:33    [16832645]     Ответить | Цитировать Сообщить модератору
 Re: Сформировать матрицу значений и вставить в таблицу  [new]
vso
Member

Откуда: СПб
Сообщений: 270
WarAnt
Настолько же на сколько использовать декартово произведение:)


Тогда подскажите как организовать отношение один-ко-многим, причем субъекты соотношения находятся в двух разных таблицах?
12 ноя 14, 21:37    [16837014]     Ответить | Цитировать Сообщить модератору
 Re: Сформировать матрицу значений и вставить в таблицу  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31868
Веткин Сергей
WarAnt
Настолько же на сколько использовать декартово произведение:)


Тогда подскажите как организовать отношение один-ко-многим, причем субъекты соотношения находятся в двух разных таблицах?
Нужно вместо CROSS JOIN использовать JOIN
13 ноя 14, 01:04    [16837451]     Ответить | Цитировать Сообщить модератору
 Re: Сформировать матрицу значений и вставить в таблицу  [new]
vso
Member

Откуда: СПб
Сообщений: 270
alexeyvg
Нужно вместо CROSS JOIN использовать JOIN


Для выборки данных я спользую JOIN, CROSS же я использую для вставки/обновления в таблицу, которая связывает две другие таблицы.

Поэтому если не CROSS, то как?

Скажем на клиенте набирается список из одной таблице, потом из другой. (это сделано для массового изменения данных, а не для построчного). И передаются две табличные переменные на сервер, где уже через CROSS мы соединяем нужное. Это хорошо для вновь вставляемых данных, а если в процессе работы условия изменились, то нужно изменить эти данные.
Опять же если просто изменить одно на другое это одно, а если количество связей изменилось в меньшую сторону, то как?
13 ноя 14, 09:33    [16837973]     Ответить | Цитировать Сообщить модератору
 Re: Сформировать матрицу значений и вставить в таблицу  [new]
Glory
Member

Откуда:
Сообщений: 104751
Веткин Сергей
Тогда подскажите как организовать отношение один-ко-многим, причем субъекты соотношения находятся в двух разных таблицах?

Как обычно - через 3ю таблицу
13 ноя 14, 10:26    [16838344]     Ответить | Цитировать Сообщить модератору
 Re: Сформировать матрицу значений и вставить в таблицу  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31868
Веткин Сергей
alexeyvg
Нужно вместо CROSS JOIN использовать JOIN


Для выборки данных я спользую JOIN, CROSS же я использую для вставки/обновления в таблицу, которая связывает две другие таблицы.

Поэтому если не CROSS, то как?

Скажем на клиенте набирается список из одной таблице, потом из другой. (это сделано для массового изменения данных, а не для построчного). И передаются две табличные переменные на сервер, где уже через CROSS мы соединяем нужное. Это хорошо для вновь вставляемых данных, а если в процессе работы условия изменились, то нужно изменить эти данные.
Опять же если просто изменить одно на другое это одно, а если количество связей изменилось в меньшую сторону, то как?
Ничего непонятно, что вы хотите сделать-то?

Как вы думаете, можно по вашему "ТЗ" дать задание разработчику? :-)
Вот получает разработчик письмо от начальника, в нём написано: "Опять же если просто изменить одно на другое это одно, а если количество связей изменилось в меньшую сторону, то как", что ему делать то надо???
13 ноя 14, 10:26    [16838346]     Ответить | Цитировать Сообщить модератору
 Re: Сформировать матрицу значений и вставить в таблицу  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31868
Glory
Веткин Сергей
Тогда подскажите как организовать отношение один-ко-многим, причем субъекты соотношения находятся в двух разных таблицах?

Как обычно - через 3ю таблицу
Вообще один-ко-многим - это обычная пара таблиц мастер-детали.
От меня ускользает проблема ТС, если честно :-)
13 ноя 14, 10:28    [16838356]     Ответить | Цитировать Сообщить модератору
 Re: Сформировать матрицу значений и вставить в таблицу  [new]
Glory
Member

Откуда:
Сообщений: 104751
alexeyvg
Вообще один-ко-многим - это обычная пара таблиц мастер-детали.
От меня ускользает проблема ТС, если честно :-)

Мда. Перепутал со многие-ко-многим.
13 ноя 14, 10:30    [16838373]     Ответить | Цитировать Сообщить модератору
 Re: Сформировать матрицу значений и вставить в таблицу  [new]
vso
Member

Откуда: СПб
Сообщений: 270
alexeyvg
От меня ускользает проблема ТС, если честно :-)


Есть две таблицы T1 и T2. Надо сопоставить строки из таблицы T1 и T2
В таблице T1 всегда должны быть строки уникальны. В таблице T2 может быть от одной строчки до неопределенного кол-ва строк соответствующих строкам в T1. Так же в таблице T2 одна строка может соответствовать нескольким в T1.

Эту задачу я решаю при помощи третьей таблицы T3. Выделив на клиенте нужные записи в T1 и Т2 я передаю через табличную переменную на сервер где это все благополучно вставляется и если надо то обновляется через скрипт:
 MERGE T3 AS TARGET
  USING (SELECT s.Id,
                d.Id
         FROM @Src s
           CROSS JOIN @Dst d) AS SOURCE (ID_SRC, ID_DST)
  ON SOURCE.ID_DST = TARGET.DST
  WHEN MATCHED THEN
    UPDATE
    SET SRC = SOURCE.ID_SRC
  WHEN NOT MATCHED THEN
    INSERT (SRC, DST)
      VALUES (ID_SRC, ID_DST);


но если в процессе работы надо внести изменения в связи да так что, скажем, было 3 а стало 2, то 1 строка будет дублироваться в Т3. Как этого избежать?

К сообщению приложен файл. Размер - 15Kb
13 ноя 14, 20:47    [16842844]     Ответить | Цитировать Сообщить модератору
 Re: Сформировать матрицу значений и вставить в таблицу  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31868
Веткин Сергей
но если в процессе работы надо внести изменения в связи да так что, скажем, было 3 а стало 2, то 1 строка будет дублироваться в Т3. Как этого избежать?
А, так вам нужно привести таблицу T3 в соответствии с результатами запроса с CROSS JOIN из ваших таблиц Т1 и Т2?

Просто добавьте секцию DELETE в оператор MERGE
13 ноя 14, 21:11    [16842902]     Ответить | Цитировать Сообщить модератору
 Re: Сформировать матрицу значений и вставить в таблицу  [new]
vso
Member

Откуда: СПб
Сообщений: 270
alexeyvg, да, Только мне не придумать условие на удаление...
14 ноя 14, 22:13    [16849345]     Ответить | Цитировать Сообщить модератору
 Re: Сформировать матрицу значений и вставить в таблицу  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31868
Веткин Сергей
alexeyvg, да, Только мне не придумать условие на удаление...


MERGE T3 AS TARGET
    USING (SELECT s.Id, d.Id
              FROM @Src s
                  CROSS JOIN @Dst d
              ) AS SOURCE (ID_SRC, ID_DST)
        ON SOURCE.ID_DST = TARGET.Ref_Detail
    WHEN MATCHED THEN
        UPDATE
        SET SRC = SOURCE.ID_SRC
    WHEN NOT MATCHED THEN
        INSERT (SRC, DST)
        VALUES (ID_SRC, ID_DST)
    WHEN NOT MATCHED BY SOURCE THEN 
        DELETE;
15 ноя 14, 01:41    [16850023]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить