繁体   English   中英

子查询中的SQL子查询

[英]SQL Subqueries within Subqueries

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

我想做的是检索所有唯一的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM