例如,我的意思是说我有一个查询,该查询将两个表A
和B
的结果组合在一起;其中A
的某些列与B
相同,但有几个不同的列,B
也是如此。是否有一条命令可以合并相同列(UNION)中的数据,但将不同列合并到最终结果(JOIN)中,还是我将不得不用乏味的方式来做到这一点?
更愿意为SQLite或Postgresql量身定制答案,但其他任何方法都可以。
编辑:
说表A
包含以下列:
ID Source Destination Timestamp
表B
包含以下列:
ID Source Destination Group Read
在两种情况下,我都希望表C
(查询)具有以下列,且互斥列的值均为NULL
:
ID Source Destination Timestamp Group Read
答案 0 :(得分:3)
如果要合并两个只包含部分相等列的表,则必须用NULL或其他默认值填充各个表的缺失列。例如
SELECT A, B, C, D, E, '' AS F
FROM X
UNION ALL
SELECT A, B, C, '' AS D, NULL AS E, F
FROM Y
如果要消除重复项,请使用UNION(不使用全部)。只有多余的列与其他表使用的默认值匹配的重复项。
另一种方法是加入匹配列以消除这些列上的重复项
SELECT
COALESCE(X.A, Y.A) AS A,
COALESCE(X.B, Y.B) AS B,
COALESCE(X.C, Y.C) AS C,
X.D,
X.E,
Y.F
FROM
X
FULL OUTER JOIN Y
ON X.A = Y.A AND
X.B = Y.B AND
X.C = Y.C
这可能与您将UNION和JOIN最好结合在一起的想法相匹配。与UNION方法不同,它合并具有相等A,B和C的行。
请注意,即使另一个表中缺少相应的记录,也必须使用FULL OUTER JOIN来包含两个表的结果。并非所有的SQL方言都具有外部联接。
coalesce function在不同的方言中具有不同的名称。
在加入NULL值时,您可能还会遇到JOIN missing NULL values问题。