1
SELECT TOP 4000 Users.Id
  FROM Users
  JOIN Streams ON Users.Id = Streams.UserId
  JOIN Playlists ON Streams.Id = Playlists.StreamId
  WHERE Playlists.FirstItemId = '00000000-0000-0000-0000-000000000000'
  //  Doesn't work
  HAVING COUNT(1) = (
    SELECT COUNT(Playlists.Id)
    FROM Playlists WHERE Playlists.StreamId = Streams.Id
)

1 つのプレイリストを持つストリームのみを持ち、その 1 つのプレイリストの FirstItemId が Guid.Empty であるすべてのユーザーを選択しようとしています。データベースのメンテナンスを行い、作成されたが使用されなかったアカウントを削除しようとしています。

クエリの最初の部分はうまく機能していますが、「子供が 1 人しかいない」フィルターを適切に適用する方法がわかりません。

4

6 に答える 6

1

以下のクエリを試して、非アクティブなユーザーを選択してください

SELECT TOP 4000 Users.Id
FROM Users
JOIN Streams ON Users.Id = Streams.UserId
JOIN Playlists ON Streams.Id = Playlists.StreamId
WHERE Playlists.FirstItemId = '00000000-0000-0000-0000-000000000000'
AND (SELECT COUNT(Playlists.Id) FROM Playlists WHERE Playlists.StreamId = Streams.Id) =1
于 2013-07-23T02:15:04.953 に答える
0

これは、質問を見る別の方法です。を使用する代わりにexists、条件に集計を使用します。

select top 4000 Id
from (SELECT u.Id,
             min(FirstItemId) as MinFI,
             max(FirstItemId) as MaxFI,
             min(p.Id) as minpid,
             max(pid) as maxpid
      FROM Users u JOIN
           Streams s
           ON u.Id = s.UserId join
           Playlists p
           ON s.Id = p.StreamId
      group by u.id
     ) u
where MinFi = MaxFi and MinFi = '00000000-0000-0000-0000-000000000000' and
      minpid = maxpid;

どのバージョンのパフォーマンスが優れているかはわかりません。これは、問題を調べる別の方法にすぎません。

于 2013-07-23T00:56:44.783 に答える
0

サブクエリなしで、次のものを持っているか、またはグループ化します:

SELECT TOP 4000 Users.Id
FROM Users
INNER JOIN Streams ON Users.Id = Streams.UserId
INNER JOIN Playlists p1 ON Streams.Id = p1.StreamId AND p1.FirstItemId = '00000000-0000-0000-0000-000000000000'
LEFT JOIN Playlists p2 ON Streams.ID = p2.StreamID and p2.FirstItemID <> '00000000-0000-0000-0000-000000000000'
WHERE p2.StreamID IS NULL
于 2013-07-23T00:36:25.223 に答える