在一个查询中从多个表中选择随机行

时间:2015-12-08 15:03:56

标签: sql sql-server

我正在尝试将一些虚拟数据插入到表(A)中,我需要来自其他两个表(B和C)的ID。如何使用随机B.Id和随机C.Id获得n行。

我有:

 select
 (Select top 1 ID from B order by newid()) as 'B.Id',
 (select top 1 ID from C order by newid()) as 'C.Id'

它给了我每张桌子的随机ID,但是获得这些内容的最佳方法是什么?我尝试加入一个大表并进行前n个,但是B和C中的ID与每行重复的随机ID相同。

所以期待最终得到类似的东西,但能够指定N行。

INSERT INTO A (B-Id,C-Id,Note)
 select
 (Select top 1 ID from B order by newid()) as 'B.Id',
 (select top 1 ID from C order by newid()) as 'C.Id',
'Rar'

所以如果B有1,2和1,2,C有Ids 11,12,13,14,那我就相当于:

INSERT INTO A (B-Id,C-Id,Note)
Values
(3,11,'rar'), (1,14,'rar'),(4,11,'rar')

每张桌子的ID随机组合

3 个答案:

答案 0 :(得分:1)

如果我正确地阅读了您的问题,我认为您希望N来自两个表的并集中的随机行 - 所以在任何给定的执行中,您将从表{{1}获得X行来自表B的{​​}和N-X行。要完成此操作,您首先C表格UNIONB,然后C ORDER BY生成的随机值,同时提取整体NEWID()

TOP N

我列出了一个列,显示了任何给定记录来自哪个源表,因此您可以看到每次执行时两个表源的分布发生变化。如果您不需要它和/或不关心验证,只需从最顶层的选择中注释掉它。

答案 1 :(得分:1)

如果您想避免重复,可以使用row_number()枚举每个表中的值(随机),然后加入它们:

select b.id as b_id, c.id as c_id
from (select b.*, row_number() over (order by newid()) as seqnum
      from b
     ) b join
     (select c.*, row_number() over (order by newid()) as seqnum
      from c
     ) c
     on b.seqnum = c.seqnum;

您只需添加top Nwhere seqnum <= N即可限制该号码。

答案 2 :(得分:0)

您不需要加入大型表格 - Select top N ID from B order by newid()应该按newid()每行工作(与RAND()不同)。您的联接可能正在进行交叉联接,这会为每个newid值提供多个结果。