使用INNER经文LEFT加入的建议

时间:2012-06-11 16:34:06

标签: sql tsql

对于一个sql数据库管理员来说,这可能是一个简单的问题,但我是一个C#人,他只涉足数据库的时间足够长,以便在必要时让他们工作。

我有一个我设计的新数据库,其中只包含很少的数据。

我需要一个用于生成视图的查询,但我似乎永远无法理解如何/何时使用INNER与LEFT连接。

Packet可以有多个Request条目(一个人请求5个不同的部分),每个Request条目可以有不同的Action个条目(暂停,取消,特别订单,完整等)。

ProductionDatabase

我想创建一个生成以下数据表的查询:

SELECT
  P.EmpID AS Requestor, P.DateStamp AS Submitted,
  T.Description AS RequestType, L.Description AS Line, R.PartNo, R.Workorder, R.Qty,
  RT.Description AS ReasonType, S.Description AS Status, A.EmpID AS Stator, A.DateStamp AS Stated, R.MTF
FROM Packet AS P
  LEFT OUTER JOIN Request AS R ON (R.PacketID=P.ID)
  LEFT OUTER JOIN Action AS A ON (A.RequestID=R.ID)
  LEFT OUTER JOIN RequestType AS T ON (R.RequestTypeID=T.ID)
  LEFT OUTER JOIN Line AS L ON (R.LineID=L.ID)
  LEFT OUTER JOIN ReasonType AS RT ON (R.ReasonTypeID=RT.ID)
  LEFT OUTER JOIN Status AS S ON (A.StatusID=S.ID)

这会返回5行,但StatusStatorStated有几个NULL条目。

所以,我尝试用INNER JOIN写这个:

SELECT
  P.EmpID AS Requestor, P.DateStamp AS Submitted,
  T.Description AS RequestType, L.Description AS Line, R.PartNo, R.Workorder, R.Qty,
  RT.Description AS ReasonType, S.Description AS Status, A.EmpID AS Stator, A.DateStamp AS Stated, R.MTF
FROM Packet AS P
  INNER JOIN Request AS R ON (R.PacketID=P.ID)
  INNER JOIN Action AS A ON (A.RequestID=R.ID)
  INNER JOIN RequestType AS T ON (R.RequestTypeID=T.ID)
  INNER JOIN Line AS L ON (R.LineID=L.ID)
  INNER JOIN ReasonType AS RT ON (R.ReasonTypeID=RT.ID)
  INNER JOIN Status AS S ON (A.StatusID=S.ID)

NULL条目现在已经消失,但现在我只返回了3行。

我如何知道我应该使用哪个版本? ...或者,我应该使用LEFT和INNER联接的组合吗?

2 个答案:

答案 0 :(得分:6)

  

我如何知道我应该使用哪个版本?

当连接条件未能给出任何匹配时,您是否希望缺少列的NULL值,或者您希望结果集中不存在该行吗?

  • 如果您希望缺少列的NULL,请使用外部联接。
  • 如果您希望缺少整行,请使用内部联接。
  

我应该使用LEFT和INNER联接的组合吗?

您应该考虑每个联接,无论您希望它是内部联接还是外部联接。

答案 1 :(得分:4)

  

我如何知道我应该使用哪个版本?

只有你能回答这个问题。你想要5行为null还是3行没有空值?

正如您从结果中注意到的,即使您正在加入的表中没有匹配的记录,LEFT JOIN也会返回一条记录(因此为空值)。如果您要加入的表中有匹配的记录,INNER JOIN将只返回记录(这就是为什么您看到3个结果而不是5个结果)。

看一下这个优秀的visual explanation of joins.