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 不能等于 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 或 1 在 PK = 4 的那一行时,这就是 FK1 的值。如果遇到问题,请多读几遍。

查询类型 2

这几乎就像第一种类型的查询。我想获取 FK2 = x 和 FK1 != y 的所有行,其中 y = FK2,其中 FK1 = x。相同,只是列颠倒了。我的重点是 FK2,而不是 FK1。

查询类型 3

我想获得 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 行)。

伙计,我希望这是有道理的。告诉我我从哪里开始没有意义,我会编辑。

谢谢阅读。感谢所有帮助。

4

1 回答 1

2

如果我理解正确的话,这三个都是相当简单的连接;

第一个左连接查找所有 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;

一个用于测试的 SQLfiddle

于 2013-03-06T06:30:06.017 回答