有没有结合SQL中UNION和JOIN功能的命令?

时间:2019-01-17 13:06:19

标签: sql database postgresql sqlite

例如,我的意思是说我有一个查询,该查询将两个表AB的结果组合在一起;其中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

1 个答案:

答案 0 :(得分:3)

如果要合并两个只包含部分相等列的表,则必须用NULL或其他默认值填充各个表的缺失列。例如

  • 具有X列A,B,C,D,E的表X
  • 具有A,B,C,F列的表Y
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问题。