sql - 这种类型的连接在最后被限定时被称为什么?

标签 sql sql-server tsql join

我正在处理旧 HR 系统中的一些 View ,该系统经常将多个联接放在一起,并且联接的“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

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

最佳答案

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

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

在某些神秘的情况下,重新排列外连接并不完全等效。不过,一般来说,内连接后跟左连接足以满足我编写的几乎所有查询。

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

关于sql - 这种类型的连接在最后被限定时被称为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54299593/

相关文章:

php - 从下拉列表中携带值到数据库

java - 将日期时间转换为 yyyy-MM-dd HH :mm:ss"format

java - 如何从 JPQLQuery 获取 SQL 字符串

sql - 有没有办法使用 NEWID 函数生成 GUID 列表?

sql-server - 限制 SQL Server Management Studio 中更新/删除的行数

SQL 选择 : Get the previous Date in column

sql - 索引和 NOT 运算符

C# 数据读取器值在调试时重复多次

sql-server - MSSQL for Linux 上的动态端口

SQL - 多个条目在 c1 中显示一个实例及其在 c2 中的对应映射