Ran*_*nes 7 sql t-sql sql-server
当我在数据库的旧视图中清理一些问题时,我遇到了这个"奇怪的" 连接条件:
from
tblEmails [e]
join tblPersonEmails [pe]
on (e.EmailID = pe.EmailID)
right outer join tblUserAccounts [ua]
join People [p]
on (ua.PersonID = p.Id)
join tblChainEmployees [ce]
on (ua.PersonID = ce.PersonID)
on (pe.PersonID = p.Id)
Run Code Online (Sandbox Code Playgroud)
表tblUserAccounts被引用为右外连接,但是在引用tblChainEmployees之后才会声明它的on条件; 然后连续两个连续的语句.
我无法在互联网上的任何地方找到相关的答案,因为我不知道这种联接被称为什么.
所以问题:
(1)这只是语法,我从来没有听说过一些特殊的名字.如果您仔细阅读此MSDN文章,您将看到(LEFT|RIGHT) JOIN必须与ON声明配对.如果不是,则将表达式解析为<table_source>.您可以使用括号使其更具可读性:
from
tblEmails [e]
join tblPersonEmails [pe]
on (e.EmailID = pe.EmailID)
right outer join
(
tblUserAccounts [ua]
join People [p]
on (ua.PersonID = p.Id)
join tblChainEmployees [ce]
on (ua.PersonID = ce.PersonID)
) on (pe.PersonID = p.Id)
Run Code Online (Sandbox Code Playgroud)
(2)我更喜欢LEFT语法,带有明确的括号(我知道,这是一个品味问题).这会产生相同的执行计划:
FROM tblUserAccounts ua
JOIN People p ON ua.PersonID = p.Id
JOIN tblChainEmployees ce ON ua.PersonID = ce.PersonID
LEFT JOIN
(
tblEmails e
JOIN tblPersonEmails pe ON e.EmailID = pe.EmailID
) ON pe.PersonID = p.Id
Run Code Online (Sandbox Code Playgroud)
(3)是的,它很聪明,就像一些C++表达式(即(i++)*(*t)[0]<<p->a)采访时一样.语言灵活.表达式和查询可能很棘手,但某些"安排"会导致可读性降低和错误.