Как выполнить ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ на сервере MS SQL, когда столбцы не имеют общего параметра, включая первичный ключ? - PullRequest
0 голосов
/ 25 мая 2020

У меня есть много таблиц (назовем их таблицами с одним параметром), которые включают идентификатор (первичный ключ) и другой параметр (2 столбца в каждой таблице). Я хочу sh объединить их все в объединенную_таблицу, состоящую из столбцов ID и param_1, param_2, ...., param_n. Объединенная_таблица НЕ имеет значения NULL для столбца ID (первичный ключ) и допускает значение NULL для других столбцов. Когда параметры имеют значение идентификатора, я могу выполнить ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ в обычном режиме и никаких проблем. Но когда один параметр не имеет общего первичного ключа ни с одним из других параметров, я сталкиваюсь с проблемой. Проще говоря, предположим, что для ID 124 есть некоторое значение для param_3 из третьей таблицы single_param, но нет других вхождений и значений в других таблицах с одним параметром.

Мой код выглядит следующим образом:

Insert into [joined_table]

(ID, param_1,param_2,param_3)

SELECT
       ID
      ,param1
      ,param2
      ,param3

FROM 
(
  SELECT 
        -- here if I write just "A.ID as ID" I will receive error of unfilled primary key column)
        COALESCE( A.ID, B.ID, C.ID) as ID 
        , A.param_1    as param1
        , B.param_2    as param2
        , C.param_3    as param3
  FROM 
     (
        (SELECT ID, param_1  FROM single_param_table_1) A

        FULL OUTER JOIN
        (SELECT IِِD, param_2  FROM single_param_table_2) B on A.ID= B.ID

        FULL OUTER JOIN 
        (SELECT ID, param_3 FROM single_param_table_3) C on A.ID = C.ID
        -- or:
        -- ISNULL(A.ID, B.ID)= C.ID
     )  

) as joined ;

Сообщение об ошибке, которое я получаю, выглядит следующим образом:

Violation of PRIMARY KEY constraint 'PK_joined_table'. Cannot insert duplicate key in object 'joined_table'.

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

В идеале я должен sh получить результат connected_table следующим образом:

 ID  |  param 1  |  param 2  |  param 3
=======================================
123  |    11     |    12     |   NULL
---------------------------------------
124  |   NULL    |   NULL    |    23

1 Ответ

1 голос
/ 25 мая 2020

Ваша проблема в том, что одна или несколько таблиц имеют дубликаты.

Тем временем ваш FULL JOIN logi c отфильтровывает строки, которые вам кажутся нужными. Вы можете упростить и улучшить лог. c:

select coalesce(t1.id, t2.id, t3.id, t4.id, . . . ) as id,
       t1.param as param1,
       t2.param as param2,
       t3.param as param3,
       t4.param as param4,
       . . .
from single_param_table_1 t1 full join
     single_param_table_2 t2
     on t2.id = t1.id full join
     single_param_table_3 t3
     on t3.id = coalesce(t1.id, t2.id) full join
     single_param_table_4 t4
     on t4.id = coalesce(t1.id, t2.id, t3.id) full join
     . . .

То есть вам нужно много использовать coalesce(), чтобы id совпадали в таблицах.

I Следует отметить, что стандартный SQL и большинство баз данных поддерживают предложение using, которое упрощает этот logi c. Однако SQL Server не поддерживает using.

Это упрощает ваш лог c. Однако ваша проблема в том, что одна или несколько таблиц имеют повторяющиеся идентификаторы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...