两个表的联合,每行的来源信息
Union of two tables with information of the origin of each row
假设我有两个 tables A
和 B
,它们都只有 1 列 name
。有些行出现在两个 table 中,而有些行只出现在一个 table 中。我想将这两个 table 合并成一个 table C
,它有 3 列 name
、is_in_A
和 is_in_B
。对于同时出现在 A
和 B
中的行,最后两个字段都是 'true'。对于只出现在 A
中的行,只有 is_in_A
会是 'true' 而 is_in_B
会是假的。
我目前的解决方案是这样的:
创建三个临时 tables,它们都有 name
、is_in_A
和 is_in_B
:
列
A_join_B
包含 A
和 B
中的所有行。 is_in_A
和 is_in_B
对于此 table 中的每一行都是正确的
A_minus_B
具有 A
独有的所有行。对于 table. 中的每一行,is_in_A
为真,is_in_B
为假
B_minus_A
分别
现在我将所有 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
如果您的数据库不支持 true
和 false
等布尔值,请更改为 1
和 0
或字符串文字 '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;
假设我有两个 tables A
和 B
,它们都只有 1 列 name
。有些行出现在两个 table 中,而有些行只出现在一个 table 中。我想将这两个 table 合并成一个 table C
,它有 3 列 name
、is_in_A
和 is_in_B
。对于同时出现在 A
和 B
中的行,最后两个字段都是 'true'。对于只出现在 A
中的行,只有 is_in_A
会是 'true' 而 is_in_B
会是假的。
我目前的解决方案是这样的:
创建三个临时 tables,它们都有 name
、is_in_A
和 is_in_B
:
A_join_B
包含A
和B
中的所有行。is_in_A
和is_in_B
对于此 table 中的每一行都是正确的
A_minus_B
具有A
独有的所有行。对于 table. 中的每一行,B_minus_A
分别
is_in_A
为真,is_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
如果您的数据库不支持 true
和 false
等布尔值,请更改为 1
和 0
或字符串文字 '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;