如何为无共同字段的表B每行匹配表A的不同随机行?
解决表B每行匹配表A不同随机行的问题
针对你遇到的子查询仅执行一次导致所有A行匹配同一B行的问题,这里提供两种适合Oracle环境的解决方案:
方法一:基于随机行号关联(推荐,高效可靠)
通过给两张表按随机顺序生成行号,再通过行号关联,确保B的每一行对应A的唯一随机行(需保证表A的行数≥表B的行数):
WITH random_A AS ( SELECT idA, ROW_NUMBER() OVER(ORDER BY dbms_random.value) AS rn FROM A ), random_B AS ( SELECT idB, ROW_NUMBER() OVER(ORDER BY dbms_random.value) AS rn FROM B ) SELECT ra.idA, rb.idB FROM random_B rb JOIN random_A ra ON ra.rn = rb.rn;
说明
- 先给表A、B分别按
dbms_random.value生成随机排序的行号rn - 利用行号一对一关联,实现B每行匹配不同的随机A行
- 该方法性能优异,适合数据量较大的场景
方法二:使用CROSS APPLY逐行生成(适合小表)
利用CROSS APPLY让子查询为B的每一行单独执行,同时排除已选中的A行,保证不重复:
SELECT rb.idB, ra.idA FROM B rb CROSS APPLY ( SELECT idA FROM A WHERE idA NOT IN ( SELECT ra2.idA FROM B rb2 CROSS APPLY ( SELECT idA FROM A ORDER BY dbms_random.value FETCH FIRST 1 ROW ONLY ) ra2 WHERE rb2.ROWID < rb.ROWID ) ORDER BY dbms_random.value FETCH FIRST 1 ROW ONLY ) ra;
说明
CROSS APPLY会为B的每一行单独触发子查询,每次随机选取一个未被之前行选中的A行- 该方法逻辑直观但性能较差,仅适合数据量较小的表
内容的提问来源于stack exchange,提问作者adi
相关产品推荐
相关产品推荐

