我需要SQL大师的帮助......
我的数据格式如下:
Key Value
100 A
100 B
300 A
400 B
500 A
500 B
500 C
600 B
600 W
如果我想找到所有带有A或B和A和B的键,而不想用其他任何东西找到AB ...我该怎么做?我需要临时表还是可以以某种方式将表连接到自身?
编辑:所需的输出将是密钥100,因为它有A& B,密钥300,因为它有A,密钥400,因为它有B.不是密钥500,因为它还包含一个C,而不是密钥600,因为它还包含一个W
答案 0 :(得分:1)
这应该适合你:
SELECT DISTINCT t1.`key`
FROM table1 t1
WHERE t1.value in('A', 'B')
GROUP BY t1.`key`
HAVING COUNT(t1.value) = (SELECT COUNT(t2.value)
FROM Table1 t2
WHERE t1.`key` = t2.`key`)
这只返回键:
A
和B
,并且不应返回任何其他内容key = 500
。但是应该包括key = 100
。A
。与key = 300
中一样。B
因此不应返回key = 600
,因为它包含的值比B
w
多一个key = 400
。但是应该包括IN('A', 'B')
。更新:这是如何运作的
如果任何键的值为HAVING
,那么它也可能包含其他值。
这就是我添加HAVING COUNT(t1.value) = (SELECT COUNT(t2.value)
FROM Table1 t2
WHERE t1.`key` = t2.`key`)
子句的原因:
COUNT(t1.value)
通过对每个值COUNT
使用相关子查询SELECT COUNT(t2.value) FROM Table1 t2 WHERE t1.key = t2.key
,将t1.value
与同一个键值的总'A', 'B'
进行比较。因此,如果当前密钥包含COUNT(t1.value)
以外的值,则COUNT
将不等于同一密钥的所有值的SELECT DISTINCT t1.`key`
FROM table1 t1
WHERE t1.value in('A', 'B')
GROUP BY t1.`key`
。例如,key = 500的count = 3,但使用:
HAVING
如果没有A'
子句,它也会包含它,因为它有HAVING
或'B'。但{{1}}子句删除了此键,因为它的count = 3不等于2。
答案 1 :(得分:0)
你应该更好地解释你的问题,如果我能正确理解你需要什么,你可以使用这样的东西:
SELECT Distinct K
FROM tab
WHERE
value IN ('A', 'B') AND
NOT EXISTS (SELECT Null from tab tab_1
WHERE tab_1.K = tab.K and tab_1.value not in ('A', 'B'))