1

我在这里需要 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 ......我该怎么做?我需要一个临时表还是可以以某种方式将表连接到自身?

编辑:所需的输出将是 Key 100,因为它具有 A 和 B,Key 300 因为它具有 A,Key 400 因为它具有 B。不是 Key 500,因为它还包含 C,而不是键 600,因为它还包含 W

4

2 回答 2

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`)

SQL 小提琴演示

这仅返回键:

  • A而且B只有,没有别的所以key = 500不应该被退回。但key = 100应该包括在内。
  • 只有A. 如key = 300.
  • has only Bsokey = 600不应该返回,因为它包含的值比Bis多一个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)的总和进行比较。因此,如果当前键包含的值不是那么将不等于同一键的所有值。例如 key = 500 有一个 count = 3 但使用:COUNTSELECT COUNT(t2.value) FROM Table1 t2 WHERE t1.key = t2.keyt1.value'A', 'B'COUNT(t1.value)COUNT

SELECT DISTINCT t1.`key`
FROM table1 t1
WHERE t1.value in('A', 'B')
GROUP BY t1.`key`

没有该HAVING子句也将包括它,因为它具有A'或“B”。但是该HAVING子句消除了这个键,因为它的计数 = 3 不等于 2。

于 2012-11-07T14:01:55.883 回答
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'))
于 2012-11-07T13:51:01.930 回答