Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SQL/Sybase: SELECT ... GROUP BY ... NOT HAVING?

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

if I wanted to select all of the col1 values that have at least one row where col2 = 'bear', I can do:

SELECT col1 
FROM mytable 
WHERE col1 IN ('A','B','C') 
GROUP BY col1 
HAVING col2 = 'bear'

which would return A and B

but I want to select only the values from col1 where there isn't a row where col2 = 'bear'

I'm thinking NOT HAVING, but that doesn't appear to work.

any ideas? thanks!

like image 293
carillonator Avatar asked May 24 '11 20:05

carillonator


2 Answers

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')
like image 143
Joe Stefanelli Avatar answered Oct 28 '22 17:10

Joe Stefanelli


You could also use this trick:

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
like image 23
Richard Tingstad Avatar answered Oct 28 '22 16:10

Richard Tingstad