【问题标题】:What is this type of join called where the joins are qualified at the end?这种类型的连接称为什么连接,连接在最后是合格的?
【发布时间】:2019-06-15 09:52:12
【问题描述】:

我正在处理旧 HR 系统中的一些视图,该系统经常将多个联接放在一起,而联接的“ON”部分直到最后才会出现。为什么有人会这样做,这样做有什么好处吗?当其中有大量连接时,我发现它很混乱。我无法很好地描述网络搜索中的情况以帮助我。

SELECT
ExportTypeIdNo = et.ExportTypeIdNo,
ExportDataStoredProcedureIdNo = et.ExportDataStoredProcedureIdNo,
ExportDataStoredProcedure = sp1.Name,
ExportFileStoredProcedureIdNo = et.ExportFileStoredProcedureIdNo,
ExportFileStoredProcedure = sp2.Name
FROM tSTORED_PROCEDURES sp2 INNER JOIN
    (tSTORED_PROCEDURES sp1 INNER JOIN
       (tEXPORT_TYPES et INNER JOIN tTYPE_CODES tc
       ON et.ReportingTreeIdNo = tc.TypeCodeIdNo)
    ON sp1.StoredProcedureIdNo = et.ExportDataStoredProcedureIdNo)
ON sp2.StoredProcedureIdNo = et.ExportFileStoredProcedureIdNo

此代码只是这种连接类型的示例。

【问题讨论】:

  • 我相信它被称为嵌套内连接,但我无法回答为什么有人会这样做。
  • 我可以想象,当程序员习惯了旧的逗号连接方式时,可能会发生这种情况,然后被指示使用新的 JOIN 语法。将select * from x, y, z where x.y_id = y.id and x.z_id = z.id 更改为select * from x (join y (join z on x.y_id = y.id) on x.z_id = z.id) 对那个人来说比将其更改为正确的select * from x join y on x.y_id = y.id join z on x.z_id = z.id 更自然。但它会忽略 JOIN 语法的好处在于它将链接条件与搜索条件分开。
  • 说得有道理,很好的侦探工作@LukStorms

标签: sql sql-server tsql join


【解决方案1】:

没有充分的理由这样做。对于inner joinjoins 的任何排序都是等效的。几乎每个人都会同意以下内容更易于遵循和维护:

FROM tEXPORT_TYPES et INNER JOIN
     tTYPE_CODES tc
     ON et.ReportingTreeIdNo = tc.TypeCodeIdNo INNER JOIN
     tSTORED_PROCEDURES sp1
     ON sp1.StoredProcedureIdNo = et.ExportDataStoredProcedureIdNo INNER JOIN
     tSTORED_PROCEDURES sp2
     ON sp2.StoredProcedureIdNo = et.ExportFileStoredProcedureIdNo

在某些神秘的情况下,重新排列外连接并不完全等效。不过,一般来说,inner joins 后跟 left joins 对于我编写的几乎所有查询都足够了。

至于为什么有人会这样写joins?我只能推测。我最可能的原因是他们在from 子句中使用了,s,并且只是变得更喜欢在连接它们的条件之前引用所有表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 2011-06-20
    相关资源
    最近更新 更多