为SQL连接选择单个(随机)行

时间:2009-09-28 13:24:31

标签: sql oracle plsql

我有一个sql查询从几个表中选择数据,但我只想匹配另一个表中的一个(随机选择的)行。

我想,更容易显示一些代码;)

表K是(k_id,已选中) 表C是(c_id,图像) 表S是(c_id,date) 表M是(c_id,k_id,得分)

所有ID列都是主键,具有适当的FK约束。

我想要的是,在英语中,对于K中的eack行,选择= 1从C获取随机行,其中M中有一行(K_id,C_id),其中得分高于给定value,以及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将所有相关行选择到一个集合中,然后选择一个随机行,但我不知道如何选择一个随机行。

3 个答案:

答案 0 :(得分:3)

您可以在查询中使用'order by dbms_random.random'指令。

即:

SELECT column FROM
  (
    SELECT column FROM table
    ORDER BY dbms_random.value
  )
WHERE rownum = 1

参考文献: http://awads.net/wp/2005/08/09/order-by-no-order/ http://www.petefreitag.com/item/466.cfm

答案 1 :(得分: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 NULL替换为ORDER BY dbms_random.value

答案 2 :(得分:-1)

我对oracle SQL不太熟悉,但是如果有这样的函数可以尝试使用LIMIT random()。