3

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、この列に対して確立した外部キ​​ー制約が壊れてしまいます。

では、私が望むものを達成するにはどうすればよいでしょうか?

4

2 に答える 2

8

テストされていませんが、これを行うことができると思います:

SELECT E1.*
FROM Example E1
JOIN Example E2
  ON E2.KeyID = 123
  AND (E2.ForeignID = E1.ForeignID
    OR (E2.ForeignID IS NULL AND E1.ForeignID IS NULL))

編集:作品、SQLフィドルはこちら

于 2013-04-09T20:28:31.350 に答える
7

あなたもできる

SELECT E1.*
FROM   Example E1
       JOIN Example E2
         ON E2.KeyID = 123
            AND EXISTS (SELECT E2.ForeignID
                        INTERSECT
                        SELECT E1.ForeignID) 
于 2013-04-09T20:31:02.047 に答える