为什么要离开连接(为什么不在where子句中使用条件进行外连接)

时间:2012-09-15 23:21:02

标签: sql

如果可以简单地写一个完整的外连接,那么左连接(或者甚至是内连接)的用途是什么

playorm=# select * from trade as a full outer join Account as b on b.id=a.accoun
tid where a.id = a.id;

这最终会返回LEFT内部联接返回的所有相同结果。

或者如果你想要一个内连接,你可以这样做

playorm=# select * from trade as a full outer join Account as b on b.id=a.accoun
tid where a.id = a.id AND b.id = b.id;

这最终会返回INNER JOIN返回的所有相同结果。

我只是觉得这有点儿很有意思。我最初错误地认为左外连接将返回空值+条件匹配但发现条件必须匹配这有点奇怪,因为在这个内连接中消除匹配的记录(可能因为连接在表达式匹配之前完成所以a .accountid为null是where子句的无用部分......

select * from trade as a inner join Account as b on b.id=a.accountid
here (b.isActive=false OR a.accountid is null) and a.number < 15;

后, 迪安

1 个答案:

答案 0 :(得分:5)

我不太确定你问题的意图。你的意思是“为什么SQL支持左外连接的语法,当它使用额外的 xxx的完全外连接的语法很容易条件时?”换句话说,left-outer-join似乎是不必要的语法糖吗?

答案:您使用语法糖来让读取您的代码的其他人更清楚您的意思。例如,想象一下学校有一张学生表和一个课程表。如果您想查看学生列表以及他们已经通过的课程,包括未通过任何课程的学生,那么左外连接会使该意图明确。如果我在你的代码中看到一个完整的外部联接,我可能会认为你也对没有人通过的课程感兴趣。在过滤掉那些不匹配的课程的条件中找到该子句需要花一些时间来挖掘你的代码。

像我这样的程序员经常被时间挤压,所以他们不会深入挖掘你的代码,所以请提供一些提示来帮助我们理解你的意图。使用synactic sugar可以增加同事的职业生涯。

顺便说一下,你声明“内连接会删除匹配的记录”。你不是说“内部联接消除了在其他表中匹配的记录”吗?实际上,最好将内连接视为返回所有匹配记录,并将左/右/全外连接视为补充来自第一/第二/两个表的非匹配记录的内部连接。