2012-04-26 76 views
0

如果我必須找到不止一次查看同一視頻的所有用途,那麼我正在使用以下查詢。oracle sql - 與加入並加入?

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

^^它確實給你,對不對?如果watching_list包含用戶觀看的userid和videoid並且包含日期時間戳。

我想要做的是加入到用戶表,基於用戶名,以查找用戶的名稱等,而不僅僅是用戶名。

我試過做簡單的連接,當然它打破了我。

回答

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; 

爲什麼這會打破?它應該是相同的用戶,所以將同一個人的group by的其他信息應該不會引起變化

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; 

我創建你的原始查詢內嵌表(不知道的術語),然後其連接到用戶表。這可能是一種更有效的方法,但我現在沒有一個測試實例在我面前進行實驗。

+0

你不需要的子查詢可言,簡單的加入和加入到組將工作。只要用戶標識保留在組中,那麼通過基於用戶向組添加更多信息將不會執行任何操作 – 2012-04-26 03:51:50

+1

我會查看真實數據集上的執行計劃。 我可以想象這比連接方法更有效,因爲如果只有少數用戶滿足「不止一次」的條件,那麼內聯視圖將首先執行,然後是用於訪問用戶表的嵌套循環連接。在連接方法中,可能會執行在watching_list和用戶之間的哈希連接,然後執行聚合。事實上,在join-first查詢中聚合的成本更高,因爲group by子句中有更多的字節。 由於這些原因,我贊成Marc對Justin的解決方案。 – 2012-04-26 08:12:19

+1

@DavidAldridge我同意這可能會更好,但會建議OP配置文件兩種方法來確保。 – 2012-04-26 12:36:00