当列不共享包括主键在内的任何参数时,如何在 MS SQL 服务器中执行 FULL OUTER JOIN?

How to do FULL OUTER JOIN in MS SQL Server when columns don't share any parameter including primary key?

我有很多 tables(我们称它们为单参数-tables),其中包括 ID(主键)和另一个参数(每个 table 中有 2 列) .我希望将它们全部加入一个由 ID 和 param_1、param_2、....、param_n 列组成的 joined_table 中。 joined_table 对于 ID 列(主键)是 NOT NULL,对于其他列是 Nullable。 当参数共享ID值时,我可以正常进行FULL OUTER JOIN,没有问题。但是当一个参数不与任何其他参数共享主键时,我就会遇到问题。 简单地说,假设对于 ID 124,第三个 single_param-table 中的 param_3 有一些值,但在其他单参数 -table 中没有其他出现和值。

我的代码如下:

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 与其他参数没有完全分开,如果它共享密钥,则会尝试将重复的行插入到 table 中。

理想情况下,我希望得到这样的结果 joined_table:

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

您的问题是一个或多个 table 重复。

与此同时,您的 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服务器不支持using

这简化了您的逻辑。但是,您的问题是一个或多个 table 具有重复的 ID。