【发布时间】:2013-10-30 10:40:26
【问题描述】:
我有两张桌子。表A 和B。每个表都有一个barcode 列。
我可以在条形码字段中加入这两个。我想要做的是找出表 A 中的哪些条形码不与 B 连接。
例如:
A 有:
001 002 003B 有:
001 003我需要一个可以拉回 002 的查询。
我该怎么做?
【问题讨论】:
我有两张桌子。表A 和B。每个表都有一个barcode 列。
我可以在条形码字段中加入这两个。我想要做的是找出表 A 中的哪些条形码不与 B 连接。
例如:
A 有:
001 002 003B 有:
001 003我需要一个可以拉回 002 的查询。
我该怎么做?
【问题讨论】:
这被称为反连接,在 MySQL 中有三个选项。以某种模糊的偏好顺序(从高到低):
OUTER JOIN 和IS NULL:
SELECT A.barcode
FROM A LEFT JOIN B USING (barcode)
WHERE B.barcode IS NULL
NOT IN:
SELECT barcode
FROM A
WHERE barcode NOT IN (
SELECT barcode
FROM B
)
NOT EXISTS:
SELECT barcode
FROM A
WHERE NOT EXISTS (
SELECT *
FROM B
WHERE B.barcode = A.barcode
)
请参阅@Quassnoi 的博客文章NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL: MySQL,了解它们各自的性能对比分析。
【讨论】: