我正在尝试将一些虚拟数据插入到表(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随机组合
答案 0 :(得分:1)
如果我正确地阅读了您的问题,我认为您希望N
来自两个表的并集中的随机行 - 所以在任何给定的执行中,您将从表{{1}获得X
行来自表B
的{}和N-X
行。要完成此操作,您首先C
表格UNION
和B
,然后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 N
或where seqnum <= N
即可限制该号码。
答案 2 :(得分:0)
您不需要加入大型表格 - Select top N ID from B order by newid()
应该按newid()
每行工作(与RAND()
不同)。您的联接可能正在进行交叉联接,这会为每个newid
值提供多个结果。