这种类型的连接称为啥连接,连接在最后是合格的?

Posted

技术标签:

【中文标题】这种类型的连接称为啥连接,连接在最后是合格的?【英文标题】: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 【参考方案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,并且只是变得更喜欢在连接它们的条件之前引用所有表。

【讨论】:

以上是关于这种类型的连接称为啥连接,连接在最后是合格的?的主要内容,如果未能解决你的问题,请参考以下文章

当设备连接由 iOS 8.3 供电时,设备在 Xcode 6.1 中不合格

一名合格前端工程师的自检清单持续更新

一名合格前端工程师的自检清单持续更新

一名合格前端工程师的自检清单持续更新

一名合格前端工程师的自检清单持续更新

为啥在尝试对整个 Spring Batch Job 进行单元测试时出现此错误?没有可用的“org.springframework.batch.core.Job”类型的合格bean