簡體   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