我有一个看起来像这样的表:
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 语句可以搜索此条目?
提前致谢...
你可以试试:
SELECT KID
FROM mytable
WHERE GRP IN ('ABS', 'AOR')
GROUP BY KID
HAVING COUNT(DISTINCT GRP) = 2
该WHERE
子句过滤掉任何非('ABS', 'AOR')
行。该HAVING
子句保证只KID
选择与两者 ('ABS', 'AOR')
关联的那些值。
一种选择,使用相关子查询:
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)
GROUP BY
如果列表增长,这是另一种使用方式更好的方法:
SELECT KID
FROM TableName t
WHERE t.GRP IN('ABS', 'AOR')
GROUP BY KID
HAVING COUNT(DISTINCT t.GRP) = 2
select kid from tablename where grp = 'ABS'
intersect
select kid from tablename where grp = 'AOR'
intersect
如果您的数据库允许,您可以使用它。
您可以使用 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