0

我正在尝试构建一个具有以下性质的查询:如果 x 在 A 和 B 的并集中,但不在 C 和 D 的并集中,则返回 x

例如:

table    table    table    table
+---+    +---+    +---+    +---+
| A |    | B |    | C |    | D |
+---+    +---+    +---+    +---+
| 1 |    | 4 |    | 2 |    | 3 |
| 2 |    | 5 |    | 3 |    | 7 |
| 3 |    | 6 |    +---+    +---+
| 4 |    | 7 |
+---+    +---+

我会寻找这个返回:

+---+
| E |
+---+
| 1 |
| 4 |
| 5 |
| 6 |
+---+

我试过了:

SELECT * from A
union
SELECT * from B
WHERE * not in
(SELECT * from C
union
SELECT * from D)

但我认为我的语法不正确。任何有关如何解决此问题的建议将不胜感激。

4

3 回答 3

2

尝试这个:

SELECT u1.col1
FROM (SELECT col1 from A union SELECT col1 from B) u1
LEFT OUTER JOIN (SELECT col1 from C union SELECT col1 from D) u2
ON u1.col1 = u2.col1
WHERE u2.col1 IS NULL

请参阅SQLFiddle上的演示。

该查询对两个联合结果进行左外连接,然后过滤掉其中一个联合结果中缺少的结果。

于 2013-05-10T10:11:32.143 回答
1

我会这样写你的查询:

SELECT *
FROM A
WHERE A.ID NOT IN (SELECT ID FROM C)
      AND A.ID NOT IN (SELECT ID FROM D)
UNION
SELECT *
FROM B
WHERE B.ID NOT IN (SELECT ID FROM C)
      AND B.ID NOT IN (SELECT ID FROM D)

你也可以这样写:

SELECT *
FROM
  (SELECT * FROM A UNION SELECT * FROM B) s
WHERE
  ID NOT IN (SELECT ID FROM C UNION SELECT ID FROM D)

在此处查看小提琴。您可能希望使用 UNION ALL 而不是 UNION 来删除重复项。

于 2013-05-10T10:17:25.133 回答
1

'union' 命令是一个查询分隔符。这意味着在它之前的是一个查询,而在它之后的是另一个查询。因此,您的 WHERE 子句将仅适用于第二个查询(SELECT * from B)。

根据您的 SQL 平台,您可以将 WHERE 子句复制到 UNION 之前,以便它适用于两个查询。或者,您可能需要使用 JOIN 或 EXCEPTION JOIN 或 EXISTS,以获得您想要的。

于 2013-05-10T10:12:32.630 回答