说,我有一张看起来像这样的表
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 | ...
我只想获取具有相同KNo的行,但仅当TB = 301中的一个时。所以在这种情况下我只想要行1,2,3,6,7,8,9,10,因为它们具有相同的KNo,并且在具有相同KNo的行中,至少有一行具有TB = 301。 我不想要第4行和第5行,因为没有行的TB = 301。
是否有一个漂亮的SQL查询可以做到这一点?
答案 0 :(得分: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 :(得分: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的KNo值。然后将它连接到主表,这消除了"坏"记录。这个不像上面的答案一样干净,但可能会对性能产生影响。