SQL按等价项分组
假设我有一张纸杯蛋糕评级表: 我想找到所有有“超级美味”和“口腔天堂”评级的纸杯蛋糕。我觉得使用GROUPBY子句和having很容易做到这一点 我在想: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
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被评为零次,那么这个查询将给你一个假阳性。我正在计算牛排的独特美味评级,所以我不知道这是怎么可能的。