Sql 组合多个表时获取重复的主键(完全联接)

Sql 组合多个表时获取重复的主键(完全联接),sql,sql-server,Sql,Sql Server,我有4个表(每个表代表一个月),只有2列(服务器和评级)。我只想对服务器名称进行分组,然后为每个月的评级设置一列。我不知道为什么它会复制服务器。任何帮助都将不胜感激 目标是: Server | 1910 | 1911 | 1912 | 2001 ---------+------+------+------+----- abcds | 2394 | Null | 2332 | 2332 代码: 由于这样的完整外部联接最终可能会导致不太直观的行为,因此最好先在子查询中收集所有相关

我有4个表(每个表代表一个月),只有2列(服务器和评级)。我只想对服务器名称进行分组,然后为每个月的评级设置一列。我不知道为什么它会复制服务器。任何帮助都将不胜感激

目标是:

Server   | 1910 | 1911 | 1912 | 2001
---------+------+------+------+-----
abcds    | 2394 | Null | 2332 | 2332    
代码:


由于这样的完整外部联接最终可能会导致不太直观的行为,因此最好先在子查询中收集所有相关的
server
值,然后将相关表左键联接到该主列表:

SELECT servers.server
   , D.[rating_configured] AS Rating_Config_1910, 
   , C.[rating_configured] AS Rating_Config_1911, 
   , B.[rating_configured] AS Rating_Config_1912, 
   , A.[rating_configured] AS Rating_Config_2001, 
FROM (
    SELECT server FROM [monthly_server_config_2001]
    UNION SELECT server FROM [monthly_server_config_1912]
    UNION SELECT server FROM [monthly_server_config_1911]
    UNION SELECT server FROM [monthly_server_config_1910]
) AS servers
LEFT JOIN [monthly_server_config_2001] AS A ON servers.server = A.server
LEFT JOIN [monthly_server_config_1912] AS B ON servers.server = B.server
LEFT JOIN [monthly_server_config_1911] AS C ON servers.server = C.server
LEFT JOIN [monthly_server_config_1910] AS D ON servers.server = D.server
;
如果一个服务器名称仍有多个结果行,则该服务器名称在其中至少一个表中不是唯一的


在原始查询中使用完全外部联接的问题是,当有服务器名为“foo”的B和C,但A没有“foo”时,B和C会产生不同的结果行。以下查询最容易说明这一点:

SELECT *
FROM (VALUES ('A'), ('B')) AS A(server)
FULL JOIN (VALUES ('B'), ('C')) AS B(server) ON A.server = B.server
FULL JOIN (VALUES ('C'), ('D')) AS C(server) ON A.server = C.server
;

您是否检查过这些表中是否有一个特定服务器的多个条目?注意:我想包括所有服务器,即使它们在最新的Month中没有值(不存在)。我建议使用COALESCE,而不是那些大量的大小写表达式。我对重复的猜测是,在一些或所有这些表中有多行用于连接谓词;您可能需要一个子查询来收集所有四个表中的服务器名称,然后将这些表左键联接到该表中。否则,不带A的每个B可以与不带A的每个C组合,以此类推。。。。或者,C需要加入A和B;D需要连接到A、B和C。我检查了这些表,似乎没有重复的。。。只有在我加入他们之后,我才能得到重复的服务器名称。
SELECT *
FROM (VALUES ('A'), ('B')) AS A(server)
FULL JOIN (VALUES ('B'), ('C')) AS B(server) ON A.server = B.server
FULL JOIN (VALUES ('C'), ('D')) AS C(server) ON A.server = C.server
;