[英]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.