使用INNER经文LEFT加入的建议

jp2*_*ode 4 sql t-sql

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

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

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

A 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)
Run Code Online (Sandbox Code Playgroud)

这将返回5行,但是,和Status,有一些NULL条目.StatorStated

所以,我试着用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)
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*ers 6

我怎么知道我应该使用哪个版本?

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

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

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

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