sql - 是否有一个命令结合了 SQL 中 UNION 和 JOIN 的功能?

标签 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

最佳答案

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

  • 包含 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(不使用 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在不同的方言中有不同的名字。

您可能还会遇到 JOIN missing NULL values加入 NULL 值时出现问题。

关于sql - 是否有一个命令结合了 SQL 中 UNION 和 JOIN 的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54236631/

相关文章:

postgresql - SQL Select with root parent

sql - 删除SQL中的相似列

database - 当具有多个具有 Play Framework 的数据库时不能使用 save()

Laravel Sail 作为生产设置

javascript - Node.js Web 套接字服务器 : Is my idea for data management stable/scalable?

php - 按原样存储和检索 ñ Ñ 字符

postgresql - 如何将 B 列的默认值设置为 PostgreSQL 中 A 列的值?

SQL Server 更新后触发器

sql - 将键值列分组为每组一行,每个键列

javascript - 如何向需要匹配 postrgres 数据库中现有表的 sequelize 模型添加约束?