1 つの主キー フィールド (KeyID) と外部キー フィールド (ForeignID) を持つテーブル (Example という名前) を想像してください。この外部キーは、テーブル内の行を別のテーブル内の外部行/アイテムにリンクするために使用され、多対 1 の関係を確立します。ただし、行の多くにはそのような関係が存在しないため、外部キー フィールドはNULL
これらの行にあります。
ここで、単一の KeyID (たとえば 123) が与えられた場合、一致する ForeignID 値を持つすべての行を含む結果セットを取得するために推奨される SQL は何ですか?
私は素朴に次のSQLから始めました:
SELECT E1.*
FROM Example E1
JOIN Example E2
ON E2.KeyID = 123
AND E2.ForeignID = E1.ForeignID
これは、一致するキー行の ForeignID に通常の値がある場合にうまく機能します。ただし、ForeignID がたまたま である場合は失敗します (何も返されません) NULL
。最初の検索を行った後、理由がわかりました(このような質問を読んだ後)が、この制限を回避するための適切な解決策は見つかりませんでした。
確かに SQL ServerANSI_NULLS
には変更可能な設定がありますが、これは汚い、潜在的に問題のあるハックのようです。
または、いつでも独自の疑似ヌル値 (0 など) を作成し、代わりに ForeignID 列に貼り付けることもできますが、それではNULL
、この列に対して確立した外部キー制約が壊れてしまいます。
では、私が望むものを達成するにはどうすればよいでしょうか?