2009-09-28 44 views
3

我有一個sql查詢從多個表中選擇數據,但我只想匹配另一個表中的單個(隨機選擇的)行。爲SQL連接選擇單個(隨機)行

更方便地顯示一些代碼,我想;)

表K是(k_id,選擇的) 表C是(C_ID,圖像) 表S是(C_ID,日期) 表M是(C_ID ,k_id,分數)

所有ID列都是主鍵,具有適當的FK約束。

我想要的是英語中的eack行選擇K = 1,從C得到一個隨機行,其中M存在一行(K_id,C_id),其中分數高於a給定值,並在c.image不是null,並且有一排s的C_ID

喜歡的東西:

select k.k_id, c.c_id, m.score 
from k,c,m,s 
where k.selected = 1 
    and m.score > some_value 
    and m.k_id = k.k_id 
    and m.c_id = c.c_id 
    and c.image is not null 
    and s.c_id = c.c_id; 

唯一的問題是這將返回所有用C符合條件的行 - 我只想要一個...

我可以看到如何使用PL/SQL來選擇全部相關的行進入一個集合,然後選擇一個隨機的,但我堅持如何選擇一個隨機的。

回答

0

與分析:

SELECT k_id, c_id, score 
    FROM (SELECT k.k_id, c.c_id, m.score, 
       row_number() over(PARTITION BY k.k_id ORDER BY NULL) rk 
      FROM k, c, m, s 
      WHERE k.selected = 1 
      AND m.score > some_value 
      AND m.k_id = k.k_id 
      AND m.c_id = c.c_id 
      AND c.image IS NOT NULL 
      AND s.c_id = c.c_id) 
WHERE rk = 1 

這將選擇一排每k_id滿足您的條件。如果您多次運行查詢,這可能會選擇相同的一組行。如果你想要更多的隨機性(每次運行產生一組不同的行),你可以用ORDER BY dbms_random.value代替

+1

ORDER BY NULL可能不會產生隨機順序。不可預知,是的,但不是隨機的。行(很有可能)會按照它們存儲在索引中的順序或讀取它們的位置返回,這可能會或可能不足以滿足OP的要求。 – erikkallen 2009-09-28 13:41:58

+0

@erikkallen>我同意,我更新了我的答案,以添加隨機性以預測不確定性:> – 2009-09-28 13:48:29

+0

完美! - 看起來像PARTITION BY是關鍵。謝謝。 – PaulJWilliams 2009-09-28 14:04:48

-1

我對Oracle的SQL不太熟悉,但是嘗試使用LIMIT random(),如果有這樣的函數可用的話。

+0

的Oracle SQL不支持LIMIT關鍵字。 – APC 2009-09-28 13:39:21

+1

謝謝,不知道:) – Marius 2009-09-28 13:50:20

+0

它確實叫它rownum ...而rownum <= x是限制x – 2009-09-29 06:23:17