[英]SQL Subqueries within Subqueries
我有一个带有表Tunes的音乐数据库。 每个Tunes记录都包含一个ArtistID
和Rating
。
我想做的是检索所有唯一的ArtistID
字段(很容易)以及一列,该列指示每个Artist曲调的某些Rating值都不为零。
我可以进行查询以返回0或1,以确定是否没有对任何Artist乐曲进行以下分级:
SELECT COUNT() FROM (
SELECT ID FROM Tune WHERE ArtistID=a AND Rating < 1 LIMIT 1
)
上面的查询将返回“ SomeUnrated”真或假(1或0)值。
我可以进行查询以返回Tunes表中具有的所有唯一艺术家ID:
SELECT DISTINCT Artist.ID, Artist.Name
FROM Artist JOIN Tune ON Artist.ID=Tune.ArtistID
如何将这两个查询组合在一起,以便获得如下所示的值列表:
Artist.ID Artist.Name SomeUnrated
我正在使用SQLite 。 这是“相关”子查询的示例吗?
如果未分级的null
(正确的数据库设计将指示该数值),则可以对分级求和。 一个数字+ null
= null
。 所以你会得到你的错误。
Select
Artist.ID,
sum(rating) as SomeUnrated
from
Artist
join Tune on Artist.ID = Tune.ArtistID
group by
Artist.ID
这是一个小提琴
我确实建议将null
作为未评级的值,如果您仍然想要零,则可以将null
合并为0
。
*我省略了名字,因为我在模式中忘记了它,只需将其添加到选择项并按分组
编辑:
我相信这是基于评论的解决方案。
SELECT
Artist.ID,
Artist.Name,
SUM(Tune.Rating) AS SomeUnrated,
COUNT()
FROM
Artist
JOIN Tune ON Artist.ID = Tune.ArtistID
GROUP BY
Artist.ID
作为进行最终查询的第一步,您可以将DISTINCT替换为GROUP BY:
SELECT
Artist.ID,
Artist.Name
FROM Artist
JOIN Tune ON Artist.ID = Tune.ArtistID
GROUP BY Artist.ID, Artist.Name;
结果与DISTINCT相同,但是现在您将能够将其他信息合并到查询中。 您将不需要将其作为子查询,但是您将需要一个条件查询,因此...
SELECT
Artist.ID,
Artist.Name,
COUNT(DISTINCT CASE WHEN Rating < 1 THEN 1 END) AS SomeUnrated
FROM Artist
JOIN Tune ON Artist.ID = Tune.ArtistID
GROUP BY Artist.ID, Artist.Name;
或者,您可以使用MAX()
计算相同的结果:
SELECT
Artist.ID,
Artist.Name,
MAX(CASE WHEN Rating < 1 THEN 1 ELSE 0 END) AS SomeUnrated
FROM Artist
JOIN Tune ON Artist.ID = Tune.ArtistID
GROUP BY Artist.ID, Artist.Name;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.