2009-09-28 58 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