当列不共享任何参数(包括主键)时,如何在mssqlserver中进行完全外部联接?

goqiplq2  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(291)

我有许多表(我们称之为单参数表),其中包括id(主键)和另一个参数(每个表中有2列)。我希望把它们都连接到一个由id和param1,param2,…,paramn列组成的连接表中。对于id列(主键),联接的\u表不为null,对于其他列,该表可为null。当参数共享id值时,我可以正常执行完全的外部连接,没有问题。但是,当一个参数不与其他任何参数共享主键时,我将面临一个问题。简单地说,假设对于id 124,有来自第三个单参数表的参数3的一些值,但在其他单参数表中没有其他出现项和值。
我的代码如下:

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与其他参数不是完全分离的,如果它共享密钥,则尝试将重复的行插入表中。
理想情况下,我希望将结果加入到表中,如下所示:

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

5q4ezhmt1#

您的问题是一个或多个表有重复项。
与此同时,你的 FULL JOIN 逻辑是过滤掉你想要的行。您可以简化和改进逻辑:

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 我们在table上比划。
我应该注意到,标准sql和大多数数据库都支持 using 简化这个逻辑的子句。但是,sql server不支持 using .
这简化了你的逻辑。但是,您的问题是一个或多个表具有重复的id。

相关问题