4

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

我有一个我设计的新数据库,里面只有很少的数据。

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

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

生产数据库

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

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)

Status这将返回 5 行,但、Stator和有一些 NULL 条目Stated

所以,我试着用 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 联接的组合吗?

4

2 回答 2

6

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

当连接条件无法提供任何匹配项时,您希望缺失列的值为 NULL 还是希望该行在结果集中不存在?

  • 如果您想要缺失列的 NULL,请使用外连接。
  • 如果您希望整行不存在,请使用内部联接。

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

对于每个连接,您应该考虑您希望它是内部连接还是外部连接。

于 2012-06-11T16:36:13.817 回答
4

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

只有你可以回答那个问题。您想要 5 行带空值还是 3 行不带空值?

正如您从结果中指出的那样,LEFT JOIN即使您要加入的表中没有匹配的记录(因此为空值), a 也会返回一条记录。仅当您要加入的表中有匹配的记录时, AnINNER JOIN才会返回一条记录(这就是您看到 3 个结果而不是 5 个结果的原因)。

看一下这个关于连接的一个很好的视觉解释。

于 2012-06-11T16:37:58.857 回答