我试图在t1中查看记录,其中来自t1的源id不在t2中。
喜欢......“其他表格中没有哪些记录?”
我是否需要在FROM子句中包含t2?感谢
SELECT t1.fee_source_id, t1.company_name, t1.document
FROM t1
WHERE t1.fee_source_id NOT IN (
SELECT t1.fee_source_id
FROM t1 INNER JOIN t2 ON t1.fee_source_id = t2.fee_source
)
ORDER BY t1.aif_id DESC
答案 0 :(得分:1)
您希望实现反连接,在MySQL中有三种可能性:
使用IN
:
SELECT fee_source_id, company_name, document
FROM t1
WHERE fee_source_id NOT IN (SELECT fee_source FROM t2)
ORDER BY aif_id DESC
使用EXISTS
:
SELECT fee_source_id, company_name, document
FROM t1
WHERE NOT EXISTS (
SELECT * FROM t2 WHERE t2.fee_source = t1.fee_source_id LIMIT 1
)
ORDER BY aif_id DESC
使用JOIN
:
SELECT t1.fee_source_id, t1.company_name, t1.document
FROM t1 LEFT JOIN t2 ON t2.fee_source = t1.fee_source_id
WHERE t2.fee_source IS NULL
ORDER BY t1.aif_id DESC
摘要
MySQL可以优化所有三种方法来进行
NESTED LOOPS ANTI JOIN
。它将从
t_left
中获取每个值,并在t_right.value
的索引中查找。如果索引命中或索引未命中,相应的谓词将分别立即返回FALSE
或TRUE
,并且将立即从t_left
返回行的决定而不检查t_right
中的其他行。然而,这三种方法生成三个不同的计划,由三个不同的代码执行。执行
EXISTS
谓词的代码 30%效率低于执行index_subquery
和LEFT JOIN
优化使用Not exists
方法的代码。这就是为什么在 MySQL 中搜索缺失值的最佳方法是使用
LEFT JOIN / IS NULL
或NOT IN
而不是NOT EXISTS
。
但是,我不完全确定这个分析如何与Optimizing Subqueries with EXISTS
Strategy上的MySQL手册部分协调一致(我的阅读)表明上面的第二种方法应该更高效第一个。
答案 1 :(得分:0)
下面的另一个选项(类似于反加入)......虽然上面有很好的答案。谢谢!
SELECT D1.deptno, D1.dname
FROM dept D1
MINUS
SELECT D2.deptno, D2.dname
FROM dept D2, emp E2
WHERE D2.deptno = E2.deptno
ORDER BY 1;