Access SQL:如果包含一个值,则选择具有相同值的所有行

时间:2017-09-01 12:47:42

标签: sql ms-access

说,我有一张看起来像这样的表

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查询可以做到这一点?

2 个答案:

答案 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值。然后将它连接到主表,这消除了"坏"记录。这个不像上面的答案一样干净,但可能会对性能产生影响。