所以我有这张桌子:
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是其他表中相同列的外键(不是相关的)。
我希望获得FK1 = x的所有行。但与此同时,我不想包含FK2 = y的行; y是FK1,其中FK2 = x。另一种说法:FK1 = x,但FK2不能等于FK2 = x的表中FK1的任何值。例如,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
注意,结果集中不包括PK> = 4的行,因为FK1!= 1.但是,结果集中不包括PK = 1的行,但FK1 = 1。为什么?因为FK2 = 2,这是当FK2 = x时的FK1等于或PK = 4的行时的1。如果你遇到麻烦,请多读几次。
这几乎就像第一种查询类型。我想获得FK2 = x和FK1!= y的所有行,其中y = FK2,其中FK1 = x。它是相同的,只有列是相反的。我的重点是FK2,而不是FK1。
我希望获得FK1 = x的所有行,仅当FK2 = y时; 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行)。
伙计,我希望这是有道理的。告诉我哪里开始没有意义,我会编辑。
感谢阅读。感谢所有帮助。
答案 0 :(得分: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;
第二个是相同查询的反向,发现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;
第三个是直接加入,没有特价。
SELECT t1.*
FROM table1 t1
JOIN table1 t2
ON t1.FK2=t2.FK1
AND t1.FK1=t2.FK2
WHERE t1.FK1 = 1;