SQL中有UNION
和UNION ALL
个运算符。第一个删除所有重复,第二个不删除。我想只删除源自不同子查询的重复项,但保留来自同一个子查询的重复项。示例:
TABLE t1: TABLE t2: TABLE t3:
a | b a | b a | b
————— ————— —————
1 | 2 1 | 2 1 | 3
1 | 2 1 | 3
我希望(SELECT * FROM t1) UNION SEMI (SELECT * FROM t3)
返回所有四行,
然后(SELECT * FROM t2) UNION SEMI (SELECT * FROM t2)
返回一行
我真的不在乎什么
(SELECT * FROM t1) UNION SEMI (SELECT * FROM t2)
会返回,但如果以某种方式依赖于子查询的顺序,那将是很好的,例如: G。在最后一个例子中,它将是两行,而在反向(t2 UNION t1
) - 一个。
我可以通过大量查询来完成,但问题是 - 这种操作是否有标准方法? 提前谢谢。
答案 0 :(得分:1)
您希望table1
与table2
中table1
中没有匹配行的所有行的联合SELECT *
FROM table1
UNION ALL
SELECT t2.*
FROM table2 t2
LEFT JOIN table1 t1 USING (a, b, ...) -- list all the columns here
WHERE t1.a IS NULL
{{1}}