2

如果可以像这样简单地编写完整的外连接,那么左连接(或者甚至可能是内连接)有什么用

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 将返回的所有相同结果。

我只是觉得这很有趣。我最初误以为左外连接会返回空值+条件匹配但发现条件必须匹配,这有点奇怪,因为在这个内连接中消除了匹配的记录(可能是因为连接是在表达式匹配之前完成的,所以.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;

后来,迪恩

4

1 回答 1

5

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

答:你使用语法糖让阅读你代码的其他人更清楚你的意思。例如,假设一所学校有一张学生表和一张课程表。如果您想查看学生列表以及他们通过了哪些课程,包括没有通过任何课程的学生,那么左外连接可以清楚地表明该意图。如果我在您的代码中看到完整的外部连接,我可能会假设您也对没有人通过的课程感兴趣。要在过滤掉那些不匹配课程的条件中找到该子句,需要深入研究您的代码。

像我这样的程序员往往时间紧迫,因此他们不会尽可能深入地研究您的代码,因此请提供提示以帮助我们理解您的意图。使用联动糖来增加同事的职业生活。

顺便说一句,您说“内部联接消除了匹配的记录”。你不是说“内连接消除了另一张表中匹配的记录”吗?实际上,您最好将内连接视为返回所有匹配的记录,将左/右/全外连接视为使用第一/第二/两个表中的不匹配记录补充内连接。

于 2012-09-16T00:04:19.017 回答