UNION 过滤掉重复的条目,而 UNION ALL 保持重复。与这种情况类似,考虑这种反例,我想设置联合以仅检查单列重复性。
SELECT id, 1 AS category FROM users UNION SELECT id, 2 FROM users_2;
在这里,我想拒绝所有 UNION 条目id, 2
并仅基于id检查重复性。
结果:
id | category
------------------
100 | 1
101 | 1
... | ...
100 | 2 # Skip this as 100 is already present
201 | 2
....
预期的:
id | category
----------------
100 | 1
101 | 1
... | ...
201 | 2
full outer join
非常方便,如下所示:它的工作原理是,如果行来自,则该
id
列将是,而当它来自时它不会为空。null
users
users_2
或者,您可以使用
union
(并使用union all
,因为我们已经在使用not exists
丢弃重复项):但正如您所见,查询变得更长。
第三种更长且可能效率更低的方法是使用
distinct on
:注意最后一个查询确实保证了输出中的顺序;前两个查询没有!
见https://dbfiddle.uk/?rdbms=postgres_13&fiddle=dd8bdbc82edc26cce9e8ba9fdde84517