2014-07-09 10 views
1

Tunes 테이블이있는 음악 데이터베이스가 있습니다. 각 음악 레코드는 ArtistIDRating을 포함합니다.하위 쿼리 내의 SQL 하위 쿼리

내가하고 싶은 일은 각각의 고유 한 ArtistID 개의 필드와 아티스트의 곡에 대한 등급 값 중 일부가 0이 아님을 나타내는 열을 더한 것입니다.

내가 아티스트의 곡 중 하나가 평가되지 않은 경우 다음과 같이 쿼리를 결정하기 위해 0 또는 1을 반환 할 수 있습니다

:

SELECT COUNT() FROM ( 
    SELECT ID FROM Tune WHERE ArtistID=a AND Rating < 1 LIMIT 1 
) 

위의 쿼리는 (a가 참 또는 거짓 "SomeUnrated"반환 1 또는 0) 값.

그리고 .. 나는 곡 테이블에 등장하는 모든 고유 아티스트 ID를 반환하는 쿼리를 만들 수 있습니다

SELECT DISTINCT Artist.ID, Artist.Name 
FROM Artist JOIN Tune ON Artist.ID=Tune.ArtistID 

나는 것을 값의 목록은 다음과 같이 그래서이 두 쿼리를 결합 할 수있는 방법을 :

Artist.ID Artist.Name SomeUnrated 

내가 SQLite는을 사용하고 있습니다. 이것은 "상관 관계가있는"부질의 예입니까?

답변

2

등급이 지정되지 않은 값이 null (적절한 db 디자인이 지정하는) 인 경우 등급을 합할 수 있습니다. + null = null입니다. 그래서 당신은 당신의 거짓을 알게 될 것입니다.

Select 
    Artist.ID, 
    sum(rating) as SomeUnrated 
from 
    Artist 
    join Tune on Artist.ID = Tune.ArtistID 
group by 
    Artist.ID 

다음은 여전히 ​​0을 원한다면, 당신은 null0에 유착 수, I는 등급이 지정되지 않은 값으로 null 추천 않는 fiddle

입니다.

나는이 의견에 따라 해결책이라고 생각 : 나는 단순히

편집하여 선택하고 그룹에 추가, 스키마에 깜빡 때문에

*

나는 이름을 떠났다. 최종 쿼리의 첫 걸음, 당신은에 의해 그룹과 DISTINCT 대체 할 수있는 것처럼

SELECT 
    Artist.ID, 
    Artist.Name, 
    SUM(Tune.Rating) AS SomeUnrated, 
    COUNT() 
FROM 
    Artist 
    JOIN Tune ON Artist.ID = Tune.ArtistID 
GROUP BY 
    Artist.ID 
+0

아니오 :

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()과 같은 결과를 산출 할 수 당신은 하위 쿼리로 그 필요하지 않습니다하지만 당신은 그것으로 갈 조건이 필요합니다, 그래서 ... 서면으로, 이것은 * 단일 아티스트 *에 대한 SUM (등급)을 찾습니다. OP는 등급이 매겨지지 않은 예술가가 있는지를 표시 한 것 같습니다 *. –

+0

@AndriyM, OP의 질문에 대한 나의 해석은 그가 모든 곡을 평가하거나 부분적으로 만 평가 한 아티스트를 구별 할 수 있기를 원한다는 것입니다. 아마도'SomeUnrated'라는 이름은 오해의 소지가 있습니다. – paqogomez

+0

@paqogomez : 고마워요. 저에게 주어진 다른 생각을 들었지만 필요한 결과를주지 못할 것 같네요. '등급'은 + ve, 0 또는 -ve 일 수 있습니다. 솔루션이 작동하는 유일한 방법은 SUM (Rating)이 Artist.ID에 속한 총 Tune 레코드 수와 같으면 1 또는 0을 반환하는 것입니다. 프로그래밍 방식으로 또는 단계적으로이 작업을 수행 할 수 있지만 실제로는 단일 SQL 문이 필요하며 SQL은 그렇게 뜨겁지 않습니다. :) – SparkyNZ

2

: 결과는 DISTINCT와 같은 것

SELECT 
    Artist.ID, 
    Artist.Name 
FROM Artist 
JOIN Tune ON Artist.ID = Tune.ArtistID 
GROUP BY Artist.ID, Artist.Name; 

하지만 지금은 다른 통합 할 수있을 것입니다 정보를 쿼리에 추가합니다.

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

감사합니다. 이렇게 많은 방법이 있습니다! :) – SparkyNZ