2012-04-26 13 views
0

同じビデオを複数回見たすべての用途を見つけなければならない場合は、次のクエリを使用しています。oracle sql - withとgroup byを持つことで参加できますか?

SELECT userid AS users,video_id 
FROM watching_list GROUP BY userid , video_id HAVING COUNT(*) > 1; 

^^そうでしょうか。 watching_listに、ユーザーが視聴したuseridとvideoidとdatetime stampが含まれている場合。

私がしたいことは、useridに基づいてuserテーブルに参加し、useridだけでなくユーザーの名前なども調べることです。

私は単純な参加を試みましたが、もちろん私はそれを壊しました。それを行うには

答えて

4
SELECT Users.Name, Users.userid AS users,video_id 
FROM watching_list 
    JOIN Users 
     ON Users.UserID = watching_list.UserID 
GROUP BY Users.userid , video_id, Users.Name 
HAVING COUNT(*) > 1; 

なぜこれが壊れますか?それはとても

Here is a crude, quick SQLFiddle to prove this

3

やや無粋な方法はそうのようなものです:

Select USERS.LAST_NAME, 
     USERS.FIRST_NAME, 
     double_watchers.VIDEO_ID 
    FROM USERS, 
     (SELECT userid AS users, 
       video_id 
     FROM watching_list 
     GROUP BY userid , video_id 
     HAVING COUNT(*) > 1) double_watchers 
Where double_watchers.userid = users.id; 

私はあなたの元のクエリで(専門用語がわからない)インラインテーブルを作成し、USERSテーブルにそれを参加しています。おそらくそれを行うより効率的な方法がありますが、私は今すぐ実験するために私の前にテストインスタンスを持っていません。

+0

あなたはシンプルに参加して、グループに追加すると動作しますが、すべてでサブクエリを必要といけない変更を引き起こすことはありませんgroup byに同一人物の追加情報を追加して、同じユーザーでなければなりません。ユーザーIDがグループに残っている限り、ユーザーに基づいてグループに追加情報を追加すると何もしません –

+1

私は実際のデータセットの実行計画を見ていきます。 これは、「複数回」の条件を満たすユーザーがほんの少数の場合、インライン・ビューが最初に実行され、次にユーザー表にアクセスするためにネストされたループ・ジョインが実行されるためです。 joinメソッドでは、おそらく、watching_listとusersの間のハッシュ結合が実行され、集約が実行されます。実際、group-clause句にはより多くのバイトが含まれているため、ジョイン・ファースト・クエリでは集約にコストがかかります。 これらの理由から、私はJustin'sを超えたMarcのソリューションを好んでいます。 –

+1

@DavidAldridge私はこれが良いかもしれないことに同意しますが、OPプロファイルが両方の方法で確実であることを示唆します。 –

関連する問題