两个表的联合,每行的来源信息

Union of two tables with information of the origin of each row

假设我有两个 tables AB,它们都只有 1 列 name。有些行出现在两个 table 中,而有些行只出现在一个 table 中。我想将这两个 table 合并成一个 table C,它有 3 列 nameis_in_Ais_in_B。对于同时出现在 AB 中的行,最后两个字段都是 'true'。对于只出现在 A 中的行,只有 is_in_A 会是 'true' 而 is_in_B 会是假的。

我目前的解决方案是这样的: 创建三个临时 tables,它们都有 nameis_in_Ais_in_B:

现在我将所有 3 个 table 合并在一起得到我的结果。

有没有 better/easier 方法来做到这一点(最好是作为一个没有任何临时 table 的单一联合)?

您可以通过 FULL 连接表来完成:

SELECT COALESCE(a.name, b.name) AS name,
       CASE WHEN a.name IS NULL THEN false ELSE true END AS is_in_A,
       CASE WHEN b.name IS NULL THEN false ELSE true END AS is_in_B
FROM a FULL OUTER JOIN b
ON b.name = a.name

如果您的数据库不支持 truefalse 等布尔值,请更改为 10 或字符串文字 'true''false'.

查看简化版 demo.

您可以使用 union all 和聚合:

select name, sum(in_a), sum(in_b)
from ((select name, 1 as in_a, 0 as in_b
       from a
      ) union all
      (select name, 0, 1
       from b
      )
     ) ab
group by name;