0

我有一个看起来像这样的表:

KID       GRP
1         ABS
1         AOR
1         AOR
2         ABS
2         ABS
2         ABS
2         AOR
2         ZVN
3         ABS

我需要找到所有具有 GRP(如 ABS 和 AOR)的 KID。所以预期结果是 1 和 2。

哪个 SELECT 语句可以搜索此条目?

提前致谢...

4

4 回答 4

2

你可以试试:

SELECT KID       
FROM mytable
WHERE GRP IN ('ABS', 'AOR')
GROUP BY KID  
HAVING COUNT(DISTINCT GRP) = 2

WHERE子句过滤掉任何非('ABS', 'AOR')行。该HAVING子句保证只KID选择与两者 ('ABS', 'AOR')关联的那些值。

于 2015-08-18T14:41:42.473 回答
1

一种选择,使用相关子查询:

SELECT DISTINCT KID       
FROM TableName t
WHERE EXISTS(SELECT 1 FROM TableName t2 
             WHERE t2.GRP='ABS' AND t.KID=t2.KID)
  AND EXISTS(SELECT 1 FROM TableName t2 
             WHERE t2.GRP='AOR' AND t.KID=t2.KID)

Demo

GROUP BY如果列表增长,这是另一种使用方式更好的方法:

SELECT KID       
FROM TableName t
WHERE t.GRP IN('ABS', 'AOR')
GROUP BY KID
HAVING COUNT(DISTINCT t.GRP) = 2

Demo

于 2015-08-18T14:32:10.987 回答
0
select kid from tablename where grp = 'ABS'
intersect
select kid from tablename where grp = 'AOR'

intersect如果您的数据库允许,您可以使用它。

于 2015-08-18T14:32:28.263 回答
0

您可以使用 Where 和 Exists 的组合

select kid from tablename a where exists
(select 1 from tablename b where b.KID = a.KID and b.GRP = 'ABS')
and GRP = 'AOR'

这也将确保您只为每个 KID 获得一个结果,而无需使用distinct

于 2015-08-18T14:35:36.823 回答