#sql #sqlite
#sql #sqlite
Вопрос:
У меня есть таблица, которая выглядит следующим образом:
CREATE TABLE tab (name TEXT, num INTEGER, hash TEXT)
Мне нужно получить строку, возвращаемую для каждого уникального хэша, для которого выполняются следующие условия:
- Хэш встречается более одного раза
- С хэшем связано более одного значения «num»
В качестве примера предположим, что у меня есть эта таблица:
name | num | hash
----- ------ -------
A | 1 | 123
B | 1 | 123
C | 2 | 456
D | 3 | 456
E | 4 | 789
F | 4 | 789
G | 5 | 789
Я хочу, чтобы возвращалось следующее:
hash
----
456
789
Я не хочу «123», потому что этот хэш встречается однозначно с num = 1.
Я пробовал это:
SELECT *
FROM tab
GROUP BY hash
HAVING COUNT(hash) > 1 AND COUNT(num) > 1;
Но это не работает, потому что это не отделяет hash
столбец от num
column. Я пробовал несколько вариантов, таких как группировать по обоим столбцам, но, похоже, ничего не работает.
Ответ №1:
Я думаю, это делает то, что вы хотите:
SELECT hash
FROM tab
GROUP BY hash
HAVING COUNT(*) > 1 AND COUNT(DISTINCT num) > 1;
Тем не менее, я был бы склонен написать:
SELECT hash
FROM tab
GROUP BY hash
HAVING COUNT(*) > 1 AND
MIN(num) <> MAX(num);
Примечание: Не используйте SELECT *
with GROUP BY
.
Ответ №2:
Первое условие:
Хэш встречается более одного раза
не требуется, поскольку он полностью покрывается 2-м:
С хэшем связано более одного значения «num»
Вы можете сделать это с помощью EXISTS:
select distinct t.hash
from tab t
where exists (
select 1 from tab
where hash = t.hash and num <> t.num
)
Смотрите демонстрацию