2017-09-01 90 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处。然后将它加入到主表中,从而消除“坏”记录。这个并不像上面的答案那样干净,但可能会影响性能。