SQL:正确的JOIN协议

时间:2014-03-19 22:10:13

标签: sql sql-server join

我有以下表格,其中包含以下属性:

Op(OpNo, OpName, Date)
OpConvert(OpNo, M_OpNo, Source_ID, Date)
Source(Source_ID, Source_Name, Date)
Fleet(OpNo, S_No, Date)

我有当前的多个JOIN查询,它给出了我想要的结果:

SELECT O.OpNo AS Op_NO, O.OpName, O.Date AS Date_Entered, C.* 
FROM Op O
LEFT OUTER JOIN OpConvert C
ON O.OpNo = C.OpNo 
LEFT OUTER JOIN Source D
ON C.Source_ID = D.Source_ID
WHERE C.OpNo IS NOT NULL

问题是这个。我需要在前面的多个JOIN语句上加入Fleet表,以将相关的S_No附加到多个JOIN表。我是否仍然可以使用LEFT OUTER JOIN完成此操作,或者我是否必须使用不同的JOIN语句?另外,我会加入哪个表格?

请注意,我只熟悉LEFT OUTER JOINS。

感谢。

2 个答案:

答案 0 :(得分:2)

我想在您的情况下,您可以使用INNER JOINLEFT JOIN(这与SQL Server中的LEFT OUTER JOIN相同。

  • INNER JOIN表示只有在Fleet表中有相应记录(基于连接条件)时才会返回其他表中的记录。
  • LEFT JOIN表示即使Fleet表中没有相应的记录(基于连接条件),它也会返回其他表中的记录。在这种情况下,Fleet中的所有列都将返回NULL。

对于要加入的表,您应该根据数据结构加入更符合逻辑的表。

答案 1 :(得分:2)

是的,您可以在加入条件中使用之前提到的所有表格。实际上,JOINS(无论是INNER,LEFT OUTER,RIGHT OUTER,CROSS,FULL OUTER还是其他)都是左联的,i。即它们被隐式评估,好像它们将被包括在左边的括号中,如下所示:

FROM ( ( ( Op O
           LEFT OUTER JOIN OpConvert C
                ON O.OpNo = C.OpNo
          ) 
        LEFT OUTER JOIN Source D
             ON C.Source_ID = D.Source_ID
       )
       LEFT OUTER JOIN Fleet
            ON ...
     )

这类似于+-隐含使用括号的方式,i。即

2 + 3 - 4 - 5

评估为

(((2 + 3) - 4) - 5)

顺便说一句:如果您使用C.OpNo IS NOT NULL,则LEFT OUTER JOIN Source D会被视为INNER JOIN,因为您明确删除了所有" OUTER&#34 ;行。