SQL - 连续的"ON"语句

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. 这种"延期条件"加入是否有名称?
  2. 如何重写以生成相同的结果集,其中on语句不连续?
  3. 也许当一直有一种更简单/更清晰的方式时,这是一个"聪明"的解决方案?

Paw*_*Dyl 6

(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)采访时一样.语言灵活.表达式和查询可能很棘手,但某些"安排"会导致可读性降低和错误.