子查询中的SQL子查询

时间:2014-07-09 04:58:59

标签: sql sqlite subquery correlated-subquery

我有一个带有Tunes表的音乐数据库。每个Tunes记录都包含ArtistIDRating

我想要做的是检索所有独特的ArtistID字段(足够简单)加上一列,表明每个艺术家的曲调的某些评级值都是非零的。

我可以进行查询以返回0或1以确定是否有任何艺术家的曲调未被评级如下:

SELECT COUNT() FROM ( 
    SELECT ID FROM Tune WHERE ArtistID=a AND Rating < 1 LIMIT 1 
)

上述查询将返回“SomeUnrated”true或false(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 。这是“相关”子查询的一个例子吗?

2 个答案:

答案 0 :(得分:2)

如果您的未评级值是null(正确的数据库设计会指定),那么您可以总结您的评分。一个数字+ null = null。所以你会得到你的错误。

Select 
  Artist.ID, 
  sum(rating) as SomeUnrated
from
  Artist 
  join Tune on Artist.ID = Tune.ArtistID
group by
  Artist.ID

这里是fiddle

我建议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

答案 1 :(得分:2)

作为最终查询的第一步,您可以将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;