SQL / Sybase: ВЫБРАТЬ … СГРУППИРОВАТЬ ПО … НЕ ИМЕЯ?

#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. Спасибо. это мне очень помогло, и это проще, чем вышеупомянутое решение, когда у вас уже есть другие таблицы, объединенные в запросе.