SQL按等价项分组

SQL按等价项分组,sql,oracle,Sql,Oracle,假设我有一张纸杯蛋糕评级表: 我想找到所有有“超级美味”和“口腔天堂”评级的纸杯蛋糕。我觉得使用GROUPBY子句和having很容易做到这一点 我在想: select distinct(cupcake) from cupcake_rating group by cupcake having delicious_rating in ('Super Delicious', 'Mouth Heaven') 我知道我不能有两个单独的AND语句。我能够通过以下方式实现我的目标: selec

假设我有一张纸杯蛋糕评级表:

我想找到所有有“超级美味”和“口腔天堂”评级的纸杯蛋糕。我觉得使用GROUPBY子句和having很容易做到这一点

我在想:

select distinct(cupcake) 
  from cupcake_rating 
 group by cupcake 
having delicious_rating in ('Super Delicious', 'Mouth Heaven')
我知道我不能有两个单独的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' )

这将不会令人满意,因为一旦我添加了我正在寻找的第三种类型的评级,查询将花费数小时,因为有很多纸杯蛋糕评级。

您可以加入所有超级美味评级,以在纸杯蛋糕上获得“嘴天堂”评级。这样你会发现所有的纸杯蛋糕都非常美味,而且口感极佳

SELECT DISTINCT cr.cupcake
FROM cupcake_rating cr
JOIN cupcake_rating cr2
    ON cr.cupcake = cr2.cupcake
WHERE cr.delicious_rating = 'Super Delicious'
    AND cr2.delicious_rating = 'Mouth Heaven'

你可以加入所有超级美味的评级,在纸杯蛋糕上获得天堂级的评级。这样你会发现所有的纸杯蛋糕都非常美味,而且口感极佳

SELECT DISTINCT cr.cupcake
FROM cupcake_rating cr
JOIN cupcake_rating cr2
    ON cr.cupcake = cr2.cupcake
WHERE cr.delicious_rating = 'Super Delicious'
    AND cr2.delicious_rating = 'Mouth Heaven'
我想找到所有有“超级美味”和“口腔天堂”评级的纸杯蛋糕

我理解上面的要求意味着纸杯蛋糕必须达到这些评级中的每一个,而不仅仅是一个或另一个。换句话说,如果每个人都把纸杯蛋糕评为“嘴天堂”,它就不合格了

          select distinct cupcake from cupcake_ratings A where rating = 'super'
          inner join
          (
           select distinct cupcake from cupcake_ratings where rating = 'heaven'
          ) x
          on A.cupcake = x.cupcake
为您提供两种评级的纸杯蛋糕列表

另外,如果您有一张纸杯蛋糕桌,您可能可以使用EXISTS对其进行优化:

         select cupcake from cupcakes
         where exists
         (
            select cupcake from ratings where rating = 'super'
            and ratings.cupcake = cupcakes.cupcake
         )

         and exists
         (
            select cupcake from ratings where rating = 'heaven'
            and ratings.cupcake = cupcakes.cupcake
         )
我想找到所有有“超级美味”和“口腔天堂”评级的纸杯蛋糕

我理解上面的要求意味着纸杯蛋糕必须达到这些评级中的每一个,而不仅仅是一个或另一个。换句话说,如果每个人都把纸杯蛋糕评为“嘴天堂”,它就不合格了

          select distinct cupcake from cupcake_ratings A where rating = 'super'
          inner join
          (
           select distinct cupcake from cupcake_ratings where rating = 'heaven'
          ) x
          on A.cupcake = x.cupcake
为您提供两种评级的纸杯蛋糕列表

另外,如果您有一张纸杯蛋糕桌,您可能可以使用EXISTS对其进行优化:

         select cupcake from cupcakes
         where exists
         (
            select cupcake from ratings where rating = 'super'
            and ratings.cupcake = cupcakes.cupcake
         )

         and exists
         (
            select cupcake from ratings where rating = 'heaven'
            and ratings.cupcake = cupcakes.cupcake
         )

你是对的,你可以用HAVING子句;也不需要使用自联接

您只需要一个有两个评级的纸杯蛋糕,因此请限制这两个评级,然后检查不同的评级数是否等于两:

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

这是更容易扩展的,因为您不需要为每个delicious rating进行新的自连接,您只需检查您是否拥有所需的号码。

如果您是正确的,您可以使用HAVING子句;也不需要使用自联接

您只需要一个有两个评级的纸杯蛋糕,因此请限制这两个评级,然后检查不同的评级数是否等于两:

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

这是更容易扩展的,因为您不需要为每个delicious rating进行新的自连接,您只需检查您是否有所需的号码。

从delicious\u rating插入的表中选择不同的纸杯蛋糕从表中选择delicious\u ratings\u这将返回草莓和蓝莓,但实际上我只想要草莓,若你们用不同的版本运行测试,你们可能会感到惊讶。我的赌注是IN、EXISTS和JOIN版本。从表中选择不同的纸杯蛋糕,其中delicious_ratings插入从表中选择delicious_ratings_此处这将返回草莓和蓝莓,但实际上我只想要草莓。如果您使用各种版本运行测试,您可能会感到惊讶。我的赌注将是IN、EXISTS和JOIN版本。很好!和我的1008.253排相比,你的在9.121秒内让我排了24排。那么你什么时候分享那些纸杯蛋糕呢?太好了!与我的1008.253排相比,你的在9.121秒内让我在9.121秒内得到了同样的24排。那么你什么时候分享那些纸杯蛋糕呢?是的@Alex:-。当我看到你的帖子时,我几乎停止了写这篇文章,然后有点震惊地继续说:-如果self-join在9.121s中管理了它,我很想知道在你的环境@MikeB中如何比较它?只有当你每个纸杯蛋糕最多有一种评级类型时,这个查询才有效。例如,如果你有一个Rasberry纸杯蛋糕被评为超级美味两次,而Mouth Heaven被评为零次,那么这个查询将给你一个假阳性。我正在计算牛排的不同美味评级,所以我不知道这怎么可能。是@Alex:-。当我看到你的帖子时,我几乎停止了写这篇文章,然后有点震惊地继续说:-如果self-join在9.121s中管理了它,我很想知道在你的环境@MikeB中如何比较它?只有当你每个纸杯蛋糕最多有一种评级类型时,这个查询才有效。例如,如果你有一个Rasberry纸杯蛋糕被评为超级美味两次,而Mouth Heaven被评为零次,那么这个查询将给你一个假阳性。我正在计算牛排的独特美味评级,所以我不知道这是怎么可能的。