1

我使用的是 SQL Server 2008,我想选择随机行记录,记录的总数取决于另一个表的列值,如何做到这一点?

我的 SQL 语句是这样的,但是错误..

select top b.number a.name, a.link_id 
from A a 
left join B b on b.link_id = a.link_id 
order by newid()

这是我的表格和预期的结果。

表 A

name   link_id 
james  100
albert 100
susan  100
simon  101
tom    101    
fion   101

表 B

link_id   number
100       2
101       1

预期结果:

  • 第一次运行时,结果可能是:

    name   link_id
    james  100
    susan  100
    fion   101
    
  • 第二次结果可能是:

    albert 100
    susan  100
    simon  101
    
  • 第三次可能是:

    james  100
    albert 100
    fion   101
    

解释

参考表B,link_id:100,编号:2

这意味着表 A 应该选择 2 个随机记录link_id = 100

并且需要选择 1 个随机记录link_id=101

4

2 回答 2

2

您可以使用 ROW_NUMBER() 函数:

SELECT A.name, A.link_id
FROM(
SELECT name,link_id, ROW_NUMBER()OVER(PARTITION BY link_id ORDER BY NEWID()) rn
FROM dbo.tblA
) AS A
JOIN dbo.tblB AS B
ON A.link_id = B.link_id
WHERE A.rn <= B.number;

这是一个 SqlFiddle 来展示这一点:http ://sqlfiddle.com/#!3/92eac/2

于 2013-01-12T18:03:50.877 回答
0

试试这个:

SELECT  a.*
FROM    b
CROSS APPLY
        (
        SELECT  TOP (b.number) a.*
        FROM    a
        WHERE   a.link_id = b.link_id
        ORDER BY
                NEWID()
        ) a

另请参阅:SQLFiddle

于 2013-01-12T18:05:48.003 回答