这种类型的连接称为啥连接,连接在最后是合格的?
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 join
,join
s 的任何排序都是等效的。几乎每个人都会同意以下内容更易于遵循和维护:
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 join
s 后跟 left join
s 对于我编写的几乎所有查询都足够了。
至于为什么有人会这样写join
s?我只能推测。我最可能的原因是他们在from
子句中使用了,
s,并且只是变得更喜欢在连接它们的条件之前引用所有表。
【讨论】:
以上是关于这种类型的连接称为啥连接,连接在最后是合格的?的主要内容,如果未能解决你的问题,请参考以下文章
当设备连接由 iOS 8.3 供电时,设备在 Xcode 6.1 中不合格
为啥在尝试对整个 Spring Batch Job 进行单元测试时出现此错误?没有可用的“org.springframework.batch.core.Job”类型的合格bean