Oracle 如何通过从另一个表中选择随机行值来更新数据
我有三个表A、B、C,我想从表B的Colu_B列中随机抽取一行,然后将其更新到表A。表C是表B的子表,用于过滤表B的数据。 以下是我的sql语句:Oracle 如何通过从另一个表中选择随机行值来更新数据,oracle,select,random,sql-update,Oracle,Select,Random,Sql Update,我有三个表A、B、C,我想从表B的Colu_B列中随机抽取一行,然后将其更新到表A。表C是表B的子表,用于过滤表B的数据。 以下是我的sql语句: update a a set a.col_a_b = (select t.col_b from (select a1.col_a, b1.col_b, a1.rn_var -- the number 6 is because I only have 6 rows of dat
update a a
set a.col_a_b =
(select t.col_b
from (select a1.col_a, b1.col_b, a1.rn_var
-- the number 6 is because I only have 6 rows of data,
-- and the real situation should be the total number of conditions in table b
from (select a0.col_a, TRUNC(dbms_random.value(1, 6)) rn_var
from a a0) a1
left join (select b.col_b, rownum rn
from b b
where exists (select 1
from c c
where b.id = c.col_b_id
and c.col_c = 'c1')) b1
on a1.rn_var = b1.rn) t
where t.col_a = a.col_a);
我发现了一个奇怪的现象:
如果我从选择a1.col_a、b1.col_b、a1.rn_var中删除a1.rn_var行,它将无法按预期工作
基于以上,如果我用left join或join替换exists,结果是相同的
如果我重新调用a1.rn_var和exists,它将正常工作
我知道可能有更好的方法来实施,但谁能告诉我为什么
更新:
实际上,这是由以下sql引起的:
select a1.col_a, b1.col_b -- remove a1.rn_var
from (select a0.col_a, TRUNC(dbms_random.value(1, 6)) rn_var from a a0) a1
left join (select b.col_b, rownum rn
from b b
where exists (select 1
from c c
where b.id = c.col_b_id
and c.col_c = 'c1')) b1
on a1.rn_var = b1.rn
-- this is for better display of results
where a1.col_a = 'a1';
在上面的sql中,我可能会得到多行数据,或者b1列为空,如下所示:
a1 b1
a1 b2
a1 b4
------------------------------------------------
a1 -- here is null
此外,列a1.col_a的每个值都是相同的,我的意思是,如果值a1有多行,那么值a2等具有相同的结果,如下所示:
a1 b2
a1 b4
a1 b5
a2 b2
a2 b4
a2 b5
...
您可以使用一个随机数并按该随机数排序以获得随机记录 我更喜欢使用以下技巧:
UPDATE A A
SET
A.COL_A_B = (
SELECT
COL_B
FROM
(
SELECT
COL_B,
TRUNC(DBMS_RANDOM.VALUE(1, COUNT(1) OVER())) RANDOM_NUMBER --GENERATES RANDOM NUMBER
FROM
(
SELECT DISTINCT
B.COL_B -- FETCHING DISTINCT RESULT
FROM
B B
-- EXISTS IS CONVERTED INTO JOIN
JOIN C C ON ( B.ID = C.COL_B_ID
AND C.COL_C = 'c1' )
)
ORDER BY
RANDOM_NUMBER -- ORDERING IS DONE BY RANDOM NUMBER
FETCH FIRST ROWS ONLY -- FETCHING ONLY FIRST ROW FROM ORDERED RECORDS
)
)
干杯 是的,这是我的工作。如果你能告诉我我描述的问题的原因,我会更高兴。首先,你的随机数rn_var只能包含6个数字,在你的例子中,只有表b中的前6个值被选取。关于更多细节,你需要告诉我当你删除问题中提到的列时实际结果是什么。这是我的错,我更新了我的问题并添加了一些实际结果的示例。是的,分析了数据。这是因为您只使用了6个随机数,在我的示例中,我使用了表b的行数作为随机数。是的,您是对的。我的想法是首先计算表b中的行数,然后取随机数。这是错的吗?