2014-03-29 2 views
0

I했습니다 다음과 같은 관계를 가지고 :, 반환 너무 많은 행

사용자 <-1을 : 많은 -> 재생 목록 <-1 : 많은 - > PlaylistItems

새 사용자가 생성되면 자동으로 하나의 빈 재생 목록이 제공됩니다.

재생 목록이 하나 뿐이고 재생 목록이 비어 있어야하는 모든 사용자를 선택하려고합니다.

는 여기에 내가있어 무엇 :

SELECT * FROM Users u 
JOIN Playlists p ON UserId = u.Id 
WHERE (0 = (SELECT COUNT(*) FROM PlaylistItems WHERE PlaylistId = p.Id) AND (1 = (SELECT COUNT(*) FROM Playlists WHERE UserId = u.Id))) 

이 반환 너무 많은 사용자. 그들 중 일부는 분명히 1 + 항목이있는 재생 목록을 가지고 있지만 SQL에 오류가 표시되지 않습니다.

좋아, 내가 고든 리노 프의 솔루션으로 가서 여기에 내가 삭제로 사용할 때 보이는 방법은 다음과 같습니다 일부 및 집계를 조인으로

DELETE from Users 
Where Id in (
    Select u.id 
    FROM users u join 
     playlists pl 
     on u.id = pl.UserId left outer join 
     playlistitems pli 
     on pli.PlaylistId = pl.id 
    GROUP BY u.id 
    HAVING count(pl.id) = 1 and 
      count(pli.id) = 0 
) 

답변

1

내가이 생각합니다. 조건에 having 조항을 사용할 수 있습니다.

select u.* 
from users u join 
    playlists pl 
    on u.id = pl.UserId left outer join 
    playlistitems pli 
    on pli.PlayListId = pl.id 
group by u.id 
having count(pl.id) = 1 and 
     count(pli.id) = 0; 
+0

감사합니다. 이것은 내 해결책과 같은 수의 행을 반환하는 것으로 보이지만, 나는이 하나의 가독성을 더 좋아합니다. :) –

+0

@SeanAnderson. . . 재생 목록에 두 개 이상의 항목이있는 사용자를 어떻게 돌려 보낼 수 있는지 알 수 없습니다. 샘플 데이터가 있다면 SQL 피들을 설정할 수 있습니까? –

+0

귀하의 솔루션이 잘못되었다고 생각하지 않습니다. 내 데이터베이스에는 예상보다 많은 수의 비활성 사용자가 있다고 생각합니다. :) 시간이 지났을 때 나는 당신의 대답을 받아 들일 것입니다. –

관련 문제