2017-09-01 89 views
1

說選擇具有相同值的所有行,我有一個表看起來像這樣訪問SQL:如果一個值包含

ID | TB | KNo | Values1 | ... 
_________________________________ 
1 | 301| 111 | 123  | ... 
2 | 302| 111 | 123  | ... 
3 | 303| 111 | 123  | ... 
4 | 302| 222 | 123  | ... 
5 | 303| 222 | 123  | ... 
6 | 301| 333 | 123  | ... 
7 | 301| 333 | 123  | ... 
8 | 302| 333 | 123  | ... 
9 | 302| 333 | 123  | ... 
10| 303| 333 | 123  | ... 
11| 303| 333 | 123  | ... 

我只想把這些行,具有相同的硝酸鉀,但只有一個TB = 301.所以在這種情況下,我只想要行1,2,3,6,7,8,9,10,11,因爲它們具有相同的KNo,而在具有相同KNo的那些行中,至少有一行行TB = 301. 即使因爲沒有行有TB = 301,我也不希望第4行和第5行。

是否有一個漂亮的SQL查詢會執行此操作?

回答

3

有不同的解決方案。例如使用EXISTS

SELECT * 
FROM tab t1 
WHERE EXISTS (SELECT 1 FROM tab t2 WHERE t1.KNo = t2.KNo AND t2.TB = 301) 

IN

SELECT * 
FROM tab t1 
WHERE t1.KNo IN(SELECT t2KNo FROM tab t2 WHERE t2.TB = 301) 
1

你也可以用做一個連接:

SELECT t1.* 
FROM table t1 
INNER JOIN 
(SELECT DISTINCT KNo 
FROM table t2 
WHERE t2.TB = 301) t2 
ON t1.KNo = t2.KNo 
ORDER BY t1.ID 

所以基本上你寫一個子查詢找到硝酸鉀值是至少有一行在TB = 301處。然後將它加入到主表中,從而消除「壞」記錄。這個並不像上面的答案那樣乾淨,但可能會影響性能。