在这张表中,我如何才能让那些喝过咖啡或啤酒却从未有过摇晃或水的人回来?

时间:2017-04-18 21:06:55

标签: sql conditional-statements teradata

Column A | Column B (Beverage)
Andres      Coffee
Erica       Coffee
David       Beer
Tyler       Beer
Tyler       Beer
Andres      Shake
Erica       Coffee
Erica       Coffee
David       Beer
David       Coffee
Tyler       Water
Tyler       Shake

然后我只想看埃里卡​​和大卫(因为他们只有咖啡和/或啤酒),但不是安德列斯,因为他有摇晃;不是泰勒,因为他既有摇晃又有水。

4 个答案:

答案 0 :(得分:0)

您可以结合使用EXISTSNOT EXISTS

SELECT *
FROM YourTable AS T
WHERE EXISTS(SELECT 1 FROM YourTable
             WHERE ColumnA = T.ColumnA
             AND ColumnB IN ('Coffee','Beer'))
AND NOT EXISTS(SELECT 1 FROM YourTable
               WHERE ColumnA = T.ColumnA
               AND ColumnB IN ('Shake','Water'))

答案 1 :(得分:0)

您可以使用not exists排除和区分以显示唯一的columnA

SELECT distinct ColA    FROM YourTable AS T
WHERE ColumnB IN ('Coffee','Beer')
AND NOT EXISTS(SELECT 1 FROM YourTable T2
               WHERE T2.ColumnA = T.ColumnA
               AND T2.ColumnB IN ('Shake','Water'))

答案 2 :(得分:0)

简单GROUP BY。
不需要相关的子查询(存在/不存在)。

select      ColumnA    
from        mytable
group by    ColumnA
having      count (case when ColumnB in ('Coffee','Beer' ) then 1 end > 0
        and count (case when ColumnB in ('Water ','Shake') then 1 end = 0

答案 3 :(得分:0)

   select columnA from t where columnB in ('Coffee','Beer')
      minus
   select columnA from t where columnB in ('Shake')
      minus
   select columnA from t where columnB in ('Shake','Water')
   having count(distinct columnB)=2
;