【问题标题】:Is there a command which combines the functionalities of UNION and JOIN in SQL?有没有结合 SQL 中 UNION 和 JOIN 功能的命令?
【发布时间】:2019-06-11 16:40:26
【问题描述】:

我的意思是,比如说我有一个查询,它结合了两个表 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

【问题讨论】:

  • 完全外连接?
  • @jarlh 不完全是(我认为),让我举个例子表来澄清一下
  • UNION ALL 与 NULL 占位符的列都不在两者中?
  • 如果没有看到其中的数据,示例表将无济于事。
  • @Garikai 是的,这就是为什么有时可以使用 Olivier 答案中的那个技巧。但也要看看 FULL JOIN 的作用。

标签: sql database postgresql sqlite


【解决方案1】:

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

  • 包含 A、B、C、D、E 列的表 X
  • 表 Y 包含 A、B、C、F 列
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(不带 ALL)。只有在额外的列与用于其他表的默认值匹配的情况下,才会有重复项。


另一种方法是加入匹配的列以消除这些列上的重复项

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 问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 2020-02-08
    相关资源
    最近更新 更多