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