1

可能重复:
MySQL - 如何获取表 A 中不存在于表 B 中的值列表?

我有三张桌子。

表十:

+------+
| ID   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+

表 Y

+------+
| ID   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
+------+

表 Z

+------+
| ID   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
|    6 |
|    7 |
+------+

我必须找到该值存在于TABLE Z但它不存在于表中X and Y

输出:

+----+
| ID |
------
| 6  |
| 7  |
+----+

我怎样才能得到这个?

4

4 回答 4

1
SELECT z.ID 
FROM TableZ z
LEFT JOIN TableX x on x.ID = z.ID
LEFT JOIN TableY y on y.Id = z.ID
WHERE x.Id IS NULL 
AND y.ID IS NULL

sqlFiddle(与 Xavi Lopez 和我的,都给出相同的结果)

于 2013-01-28T13:44:00.783 回答
1

你可以EXISTS用来做一个子查询。

SELECT tz.id 
FROM Z tz 
WHERE 
    NOT EXISTS (select 1 from X tx where tx.id = tz.id)
    AND NOT EXISTS (select 1 from Y ty where ty.id = tz.id)

不过, @RaphaëlAlthaus 的回答在效率上可能会更好。请参阅使用 JOIN 或使用 EXISTS 可以获得更好的性能吗?

MySQL 参考有一个关于EXISTS13.2.9.6 的部分。带有 EXISTS 或 NOT EXISTS 的子查询

于 2013-01-28T13:44:05.540 回答
0
SELECT  a.ID
FROM    tableZ a
        LEFT JOIN
        (
            SELECT ID FROM tableX
            UNION 
            SELECT ID FROM tableY
        ) b ON a.ID = b.ID
WHERE   b.ID IS NULL
于 2013-01-28T13:45:01.343 回答
0

你可以使用减号功能

SELECT * FROM Z
MINUS
(
SELECT * FROM Y
UNION
SELECT * FROM X
)
于 2013-01-28T13:50:10.880 回答