gpt4 book ai didi

SQL - 连续 "ON"语句

转载 作者:行者123 更新时间:2023-12-04 11:49:09 29 4
gpt4 key购买 nike

当我在数据库的旧 View 中清理一些问题时,我遇到了这个“奇怪”的连接条件:

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)

表 tblUserAccounts 被引用为右外连接,但直到引用 tblChainEmployees 之后才声明它的 on 条件;那么连续有两个连续的 on 语句。

我在互联网上的任何地方都找不到相关的答案,因为我不知道这种联接叫什么。

所以问题:
  • 这种“延迟条件”连接有名字吗?
  • 在 on 语句不连续的情况下,如何重写它以产生相同的结果集?
  • 当总是有更简单/更清晰的方法时,也许这是一个“聪明”的解决方案?
  • 最佳答案

    (1) 这只是语法,我从来没有听说过一些特殊的名字。如果您仔细阅读this MSDN article你会看到 (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)

    (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

    (3) 是的,它很聪明,就像面试中的一些 C++ 表达式(即 (i++)*(*t)[0]<<p->a )一样。语言灵活。表达式和查询可能很棘手,但一些“安排”会导致可读性下降和错误。

    关于SQL - 连续 "ON"语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38796658/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com