我有许多表(我们称之为单参数表),其中包括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
1条答案
按热度按时间5q4ezhmt1#
您的问题是一个或多个表有重复项。
与此同时,你的
FULL JOIN
逻辑是过滤掉你想要的行。您可以简化和改进逻辑:也就是说,你需要大量使用
coalesce()
所以id
我们在table上比划。我应该注意到,标准sql和大多数数据库都支持
using
简化这个逻辑的子句。但是,sql server不支持using
.这简化了你的逻辑。但是,您的问题是一个或多个表具有重复的id。