2013-11-22 85 views
1

我的問題是:如何顯示每個在錄製帶子上錄製了至少一個標題的藝術家的名稱?使用HAVING COUNT的SQL子查詢

我已制定以下查詢:

select ar.artistname, ti.titleid from artists ar 
where exists 
(
select 0 
from titles ti where ti.artistid = ar.artistid 
and exists 
(
select 0 
from studios s 
where s.studioid = ti.studioid 
and ar.artistname = 'The Bullets' 
) 
); 

然而,我需要包括HAVING COUNT(ti.titleid)> 0,以滿足這一部分,在「已記錄的至少一個標題的每個藝術家」這個問題。

我也不確定如何匹配至少錄製過一個工作室的藝術家名字「子彈隊」。

藝術家表resmebles如下:

Artists 
------- 
ArtistID, ArtistName, City 

的曲目表resmebles如下:

Tracks 
------ 
TitleID, ArtistID, StudioID 

影城表resmebles的folllowing:

Studios 
------- 
StudioID, StudioName, Address 

我也絕指定我不能使用連接,例如性能偏好。

+0

你的查詢很好,你不需要'HAVING COUNT(*)> 0'。如果一行存在,那大於0,不是嗎? –

+0

那麼,我需要知道子彈是否在樂隊所在的工作室錄製過至少一個標題。用該實施進行編輯。這是對的嗎?你可以說? – user2948897

+0

你不能使用連接?爲什麼?這是一種難題/作業嗎? –

回答

4

也許這樣嗎?

select ArtistName from Artists where ArtistID in (
    select ArtistID from Tracks where StudioID in (
    select StudioID from Tracks where ArtistID in (
     select ArtistId from Artists where ArtistName='The Bullets' 
    ) 
) 
) 

我不明白爲什麼你認爲having是必要的。

+0

我認爲他意味着他必須使用有作爲要求 – wvdz

+0

在發佈之前制定問題時,我認爲這是必要的。它是多餘的? – user2948897

+0

是的。這是多餘的。 –

2

其中記錄

SELECT StudioID 
FROM Sudios S 
JOIN Tracks T ON S.StudioID = S.StudioID 
JOIN Artists A ON T.ArtistID = A.ArtistID AND A.ArtistName = 'The Bullets' 

每一個藝術家子彈工作室(S)誰記錄有

SELECT A1.ArtistName, A1.City 
FROM Artist A1 
JOIN Tracks T1 ON T1.ArtistID = A2.ArtistID 
WHERE T1.SudioID IN 
(
    SELECT StudioID 
    FROM Sudios S 
    JOIN Tracks T ON S.StudioID = S.StudioID 
    JOIN Artists A ON T.ArtistID = A.ArtistID AND A.ArtistName = 'The Bullets' 
) T 
0

這兩個要求很愚蠢 - 使用HAVING COUNT(*)> 0並且沒有連接。我從來沒有聽說過通過聯接選擇子查詢來提高性能。

但是,我認爲這個查詢符合這些要求。

SELECT a.ArtistName FROM Artist a 
WHERE EXISTS 
(
    SELECT t1.ArtistId FROM Track t1 
    WHERE t1.ArtistId = a.ArtistId 
    AND EXISTS 
    (
     SELECT * FROM Track t2 
     WHERE t1.StudioId = t2.StudioID 
     AND t2.ArtistName = 'The Bullets' 
    ) 
    GROUP BY t1.ArtistId, t1.StudioId 
    HAVING COUNT(*) > 0 
);