半不同的联盟

时间:2013-11-21 19:52:08

标签: mysql union union-all

SQL中有UNIONUNION 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) - 一个。

我可以通过大量查询来完成,但问题是 - 这种操作是否有标准方法? 提前谢谢。

1 个答案:

答案 0 :(得分:1)

您希望table1table2table1中没有匹配行的所有行的联合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}}