真正的左外连接

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 的优化器表现不同,我也不会感到惊讶。

以上是关于真正的左外连接的主要内容,如果未能解决你的问题,请参考以下文章

带条件sql的左外连接

LINQ:具有多个条件的左外连接

LINQ查询中的左外连接[重复]

带有子查询的左外连接?

删除重复的左外连接

Linq中的lambda /方法语法中的左外连接[重复]