当列不共享包括主键在内的任何参数时,如何在 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。
我有很多 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。