簡體   English   中英

SQL:當column2!= y時查詢column = x的位置; 當列2 = x..if時,y =列是有意義的

[英]SQL: Query where column = x, when column2 != y; y = column when column2 = x..if that makes sense

所以我有這張桌子:

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時的FK1等於或PK = 4的行時的1。如果你遇到麻煩,請閱讀幾次。

查詢類型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行)。

伙計,我希望這是有道理的。 告訴我在哪里開始沒有意義,我會編輯。

謝謝閱讀。 所有幫助表示贊賞。

如果我理解正確的話,所有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;

一個用於測試的SQLfiddle

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM