联接在最后合格时称为什么类型的联接?

时间:2019-01-22 00:20:38

标签: sql sql-server tsql join

我正在使用旧的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

此代码只是这种连接的外观示例。

1 个答案:

答案 0 :(得分:5)

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

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后跟left join s足以满足我编写的几乎所有查询。

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