SQL Group By等价物

Mik*_*keB 1 sql oracle

假装我有一张cupcake_rating桌子:

id     |     cupcake      |    delicious_rating
--------------------------------------------
1      |     Strawberry   |    Super Delicious
2      |     Strawberry   |    Mouth Heaven
3      |     Blueberry    |    Godly
4      |     Blueberry    |    Super Delicious
Run Code Online (Sandbox Code Playgroud)

我想找到所有具有'Super Delicious'和'Mouth Heaven'评级的纸杯蛋糕.我觉得使用一个group by条款很容易实现,也许是一个having.

我刚在想:

select distinct(cupcake) 
  from cupcake_rating 
 group by cupcake 
having delicious_rating in ('Super Delicious', 'Mouth Heaven')
Run Code Online (Sandbox Code Playgroud)

我知道我不能有两个单独的AND语句.我能够通过以下方式实现我的目标:

select distinct(cupcake) 
  from cupcake_rating 
 where cupcake in ( select cupcake 
                      from cupcake_rating 
                     where delicious_rating = 'Super Delicious' ) 
   and cupcake in ( select cupcake 
                      from cupcake_rating 
                     where delicious_rating = 'Mouth Heaven' )
Run Code Online (Sandbox Code Playgroud)

这不会令人满意,因为一旦我添加了我想要的第三种评级,查询将花费数小时(有很多蛋糕评级).

Ben*_*Ben 7

你是对的,你可以使用HAVING子句; 也没有必要使用自联接.

你只想要一个有两个等级的蛋糕,所以限制这两个等级,然后检查DISTINCT等级数是否等于两个:

select cupcake
  from cupcake_rating
 where delicious_rating in ('Super Delicious', 'Mouth Heaven')
 group by cupcake
having count(distinct delicious_rating) = 2
Run Code Online (Sandbox Code Playgroud)

SQL小提琴

这更容易扩展,因为您不需要为每个美味的评级进行新的自我加入,您只需要检查您是否拥有所需的数字.

  • 4.034秒:) (2认同)