#sql #group-by #sybase
#sql #сгруппировать по #sybase
Вопрос:
col1 col2
A bear
A dog
A cat
B bear
B dog
B cat
C dog
C cat
D bear
D dog
D cat
E bear
E dog
E cat
F dog
F cat
если бы я хотел выбрать все значения col1, в которых есть хотя бы одна строка, где col2 = 'bear'
, я могу сделать:
SELECT col1
FROM mytable
WHERE col1 IN ('A','B','C')
GROUP BY col1
HAVING col2 = 'bear'
который вернул бы A и B
но я хочу выбрать только значения из col1, где нет строки, в которой col2 = 'bear'
Я думаю NOT HAVING
, но, похоже, это не работает.
есть идеи? Спасибо!
Комментарии:
1.
Having Col2 != 'bear'
Получается то, что вам нужно?2. однако это вернуло бы A, B и C, потому что
col2 = 'cat'
и'dog'
каждый удовлетворяетcol2 != 'bear'
3. Не беспокойтесь. В наши дни я не провожу с SQL столько времени, сколько раньше. Где не существует было моим следующим предложением, но оно уже есть в ответе.
Ответ №1:
SELECT m1.col1
FROM mytable m1
WHERE NOT EXISTS(SELECT NULL
FROM mytable m2
WHERE m2.col1 = m1.col1
AND m2.col2 = 'bear')
AND m1.col1 IN ('A', 'B', 'C')
Комментарии:
1. потрясающе, спасибо! Я просто отредактировал его, чтобы сделать его немного ближе к реальности с большим количеством строк: Я знаю, что могу добавить
WHERE col1 IN (A,B,C)
к обоим вашим операторам SELECT, но есть ли более элегантный способ?2. @carillonator: Вам нужно будет только добавить это условие во внешний
SELECT
. Я отредактировал свой ответ, чтобы отразить это изменение.
Ответ №2:
Вы также могли бы использовать этот трюк:
SELECT col1
FROM mytable
WHERE col1 IN ('A','B','C')
GROUP BY col1
HAVING SUM(CASE col2 WHEN 'bear' THEN 1 ELSE 0 END)=0
Комментарии:
1. Спасибо. это мне очень помогло, и это проще, чем вышеупомянутое решение, когда у вас уже есть другие таблицы, объединенные в запросе.