0

だから私はこのテーブルを持っています:

PK | FK1 | FK2
1  | 1   | 2
2  | 1   | 3
3  | 1   | 6
4  | 2   | 1
5  | 2   | 6
6  | 5   | 3

PKは主キー(dur)です。FK1とFK2は、他のテーブルの同じ列への外部キーです(関連性はありません)。

クエリタイプ1

FK1=xであるすべての行を取得したいと思います。同時に、FK2=yの行は含めたくありません。yはFK1であり、FK2=xです。別の言い方をすれば、FK1 = xですが、FK2=xであるテーブルのFK1の値とFK2を等しくすることはできません。たとえば、x = 1:

PK | FK1 | FK2 | Returned in Result Set (Yes = √, No = x)
1  | 1   | 2   | x
2  | 1   | 3   | √
3  | 1   | 6   | √
4  | 2   | 1   | x
5  | 2   | 6   | x
6  | 5   | 3   | x

FK1!= 1であるため、PK> = 4の行は結果セットに含まれていません。ただし、PK = 1の行は結果セットに含まれていませんが、FK1 = 1です。なぜですか?FK2 = 2であるため、PK=4の行でFK2=xまたは1の場合にFK1が等しくなります。問題が発生した場合はそれを数回読んでください。

クエリタイプ2

これは、最初のタイプのクエリとほとんど同じです。FK2 = xおよびFK1!= y、y = FK2、FK1=xのすべての行を取得したいと思います。同じですが、列だけが逆になっています。私の焦点はFK1ではなくFK2です。

クエリタイプ3

FK2 = yの場合にのみ、FK1=xであるすべての行を取得したいと思います。y = FK1ここで、FK2=x。うまくいけば、ここでxとyを使用して規則に従っているので、あまり説明する必要はありません。これが例です、x = 1:

PK | FK1 | FK2 | Returned in Result Set (Yes = √, No = x)
1  | 1   | 2   | √
2  | 1   | 3   | x
3  | 1   | 6   | x
4  | 2   | 1   | x
5  | 2   | 6   | x
6  | 5   | 3   | x

最初の行のみが返されます(PK = 1)。なぜですか。FK1 = xまたは1であり、FK2 = yまたは2であるため、これはFK1であり、FK2 = 1です(行4)。

男、私はこれが理にかなっていることを願っています。意味がわからなくなったところを教えてください。編集します。

読んでくれてありがとう。すべての助けに感謝します。

4

1 に答える 1

2

私があなたを正しく理解していれば、3つすべてはかなり単純な結合です。

最初の左結合は、FK1 = 1のすべての行を検索し、FK1とFK2が逆になっている一致するペアを持つすべての行をフィルターで除外します。

SELECT t1.* 
FROM table1 t1
LEFT JOIN table1 t2
  ON t1.FK1=t2.FK2 
 AND t1.FK2=t2.FK1
WHERE t2.PK IS NULL
AND t1.FK1 = 1;

2つ目は、同じクエリの逆で、代わりにFK2=1を検索します。

SELECT t1.* 
FROM table1 t1
LEFT JOIN table1 t2
  ON t1.FK1=t2.FK2 
 AND t1.FK2=t2.FK1
WHERE t2.PK IS NULL
AND t1.FK2 = 1;

3つ目は、特別なものではなく、単純な参加です。

SELECT t1.*
FROM table1 t1
JOIN table1 t2
  ON t1.FK2=t2.FK1
 AND t1.FK1=t2.FK2
WHERE t1.FK1 = 1;

テスト用のSQLfiddle

于 2013-03-06T06:30:06.017 に答える