2013-11-22 2 views
1

질문 : "The Bullets"라는 밴드가 녹음 된 스튜디오에서 적어도 하나의 타이틀을 녹음 한 각 아티스트의 이름을 어떻게 표시합니까?보유중인 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' 
) 
); 

하지만, I는에서 "적어도 하나 개의 타이틀을 기록하고 각각의 아티스트"이 부분을 만족 COUNT에게 (ti.titleid)> 0을 갖는 포함해야

I는 다음 질의를 공식화 질문.

적어도 하나의 스튜디오를 녹음 한 "The Bullets"라는 아티스트 이름과 어울리는지 확실하지 않습니다.

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

스튜디오 표는 folllowing resmebles :

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

트랙 테이블은 다음 resmebles :

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

나는 또한 해야

연예인 테이블은 다음과 resmebles 조인을 사용할 수 없도록 지정, 예를 들어, 성능 선호도. 총알이

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' 

모든 아티스트를 기록

+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 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 
);