4

これは、SQLデータベース管理者にとってはおそらく簡単な質問ですが、私はC#の人であり、必要なときにデータベースを機能させるのに十分な時間だけデータベースに手を出しています。

私が設計した新しいデータベースには、ほんの少しのデータしか含まれていません。

ビューを生成するために使用されるクエリが必要ですが、INNERとLEFTの結合をいつどのように使用するかを理解できないようです。

APacketには複数のRequestエントリ(1人が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)

Statusこれは5行を返しますが、、、、StatorおよびのNULLエントリがいくつかありますStated

だから、私はこれをINNERJOINで書いてみました:

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

どのバージョンを使用する必要があるかを知るにはどうすればよいですか?

その質問に答えられるのはあなただけです。null を含む 5 行または null を含まない 3 行が必要ですか?

結果からわかるように、LEFT JOIN結合しているテーブルに一致するレコードがない場合でも、 a はレコードを返します (したがって、null 値)。は、結合しているテーブルに一致するINNER JOINレコードがある場合にのみレコードを返します (これが、5 つではなく 3 つの結果が表示される理由です)。

結合の優れた視覚的説明については、これを見てください。

于 2012-06-11T16:37:58.857 に答える