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

Dea*_*ler 2 sql

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

playorm=# select * from trade as a full outer join Account as b on b.id=a.accoun
tid where a.id = a.id;
Run Code Online (Sandbox Code Playgroud)

这最终会返回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;
Run Code Online (Sandbox Code Playgroud)

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

我只是觉得这有点儿很有意思.我本来误以为左外连接将返回条件相匹配+什么空却发现开出的条件都符合这是因为在这种内在的一种奇怪的加入消除了匹配(可能是因为联接是表达之前进行记录匹配这样的一个.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;
Run Code Online (Sandbox Code Playgroud)

后来,迪恩

小智 5

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

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

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

顺便说一句,你声明"内连接消除了匹配的记录".你不是说"内联接消除了在另一个表中不匹配的记录"吗?其实,你最好还是想内部联接为返回所有匹配的记录,和左/右/全外连接作为补充肠子从第一/第二/两个表不匹配的记录加入.