セットアップ:
私のデータベースには、操作する必要のある3つのテーブルがあります。最初の2つとPartList
を呼び出しましょうPartHist
。PartList
マシンに搭載されているすべての部品番号が含まれています(このフィールドをこのフィールドと呼びますExpectedPart
)。PartHist
マシン上にあることが確認されているすべてのコンポーネントが含まれています(VerifiedPart
)。両方のテーブルには、MachineID
特定の物理マシンを参照するフィールドが含まれています。
これまでのところ、私のクエリは次のようになります。
SELECT
ExpectedPart,
VerifiedPart
FROM
PartList List
LEFT OUTER JOIN PartHist Hist
ON
List.MachineID = Hist.MachineID
AND List.ExpectedPart = Hist.VerifiedPart
Where
List.MachineID = 'SomeID'
問題:
これまでのところ、の値VerifiedPart
はNULL
その部分が検証されるまでであるため、このクエリは、どのコンポーネントがまだ検証されていないかを判断するのに非常にうまく機能します。パーツ番号がにある特定のパーツを除いて、PartList
その検証は別のテーブルに保存されます(私のせいではありません)。したがって、検証された後でも、クエリはNULL
この部分を返します。
この3番目のテーブルは、これをSpecialCase
、hasMachineID
およびVerifiedPartSP
fieldsと呼びます。PartHist
パーツがこの特殊なケースのパーツのインスタンスである場合は「Y」を含み、そうでない場合は「N」を含むフィールドもテーブルにあります。このフィールドはと呼ばれSpYesNo
ます。
質問:検証されたすべてのパーツを含む単一のフィールドをクエリに作成できますか?どういうわけか、条件を使用する方法があるのではないかと思いました...
IF (PartHist.SpYesNo = 'Y') THEN use SpecialCase.VerifiedPartSP as VerifiedPart
IBMDB2データベースを使用しています
2つの「検証済み」パーツテーブルを結合して、結合することができます。
SELECT
ExpectedPart,
VerifiedPart
FROM
PartList List
LEFT OUTER JOIN
(
SELECT machineid, verifiedpart FROM PartHist
UNION
SELECT machineid, verifiedpartsp FROM SpecialCase
)Hist
ON
List.MachineID = Hist.MachineID
AND List.ExpectedPart = Hist.VerifiedPart
Where
List.MachineID = 'SomeID'
LEFT OUTER JOIN
これらのテーブルの両方にアクセスし、CASE
ステートメントを使用していずれかのフィールドをチェックすることもできますが、このアプローチは要件によりよく適合し、より高速に実行されると思います。
これは、何が何であるかを理解するためのJOINステートメントとCASEステートメントを含むバージョンです。
SELECT
ExpectedPart,
CASE WHEN PartHist.SPYesNo = 'Y' THEN SpecialCase.VerifiedPartSP ELSE partHistVerifiedPart END as VerifiedPart
FROM
PartList List
LEFT OUTER JOIN PartHist ON
List.MachineID = PartHist.MachineID AND
List.ExpectedPart = PartHist.VerifiedPart
LEFT OUTER JOIN SpecialCase ON
List.MachineID = SpecialCase.MachineID AND
List.ExpectedPart = SpecialCase.VerifiedPart
Where
List.MachineID = 'SomeID'
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加