真正的左外连接
Posted
技术标签:
【中文标题】真正的左外连接【英文标题】:Real left outer join 【发布时间】:2011-08-02 02:49:42 【问题描述】:如何在 mysql 中执行?似乎它的左外连接包括内连接。我需要在表a
中查找不在表b
中的记录。
我能想到的最好的是
select * from `a` where `a`.`index` not in (select `index` from `b`)
还有没有更优化的方法?也许没有子查询?
【问题讨论】:
Need SQL Query to find Parent records without child records的可能重复 您所描述的不是左外连接。左连接包含表a
中的所有记录,而不管表b
中是否存在匹配记录。
我建议使用not exists
而不是not in
。
【参考方案1】:
这是使用左连接的方式:
select *
from `a`
left outer join `b`
on `a`.`index` = `b`.`index`
where `b`.`index` is null
【讨论】:
我同意这行得通,但不止一个 DBA 告诉我要避免这种类型的查询 - 这与数据库引擎无法正确优化这一点有关,因此性能受到影响.我不知道这是否属实,但至少值得对其他方法进行一些性能测试。 @Joe,这真的取决于数据库...... MySql 也不是很好的子查询,所以我认为这不会太重要,在这里。 @jswolf19:这是有道理的。我的建议来自 SQL Server 和 Oracle DBA,但如果发现 MySQL 的优化器表现不同,我也不会感到惊讶。以上是关于真正的左外连接的主要内容,如果未能解决你的问题,请参考以下文章