对于简单的SQL,
SELECT top 3 MyId FROM MyTable ORDER BY NEWID()
如何为它们添加行号,以便行号变为1,2和3?
更新
我认为我可以如上所述简化我的问题,但事实证明它更复杂。所以这里有一个更全面的版本 - 我需要为每个人提供三个随机选择(来自MyTable
),选择/行号为1,2和3,并且人与选择之间没有逻辑连接。
SELECT * FROM Person
LEFT JOIN (
SELECT top 3 MyId FROM MyTable ORDER BY NEWID()
) D ON 1=1
以上SQL的问题是,
这是一个可以测试它的工作SQL:
SELECT TOP 15 database_id, create_date, cs.name FROM sys.databases
CROSS apply (
SELECT top 3 Row_number()OVER(ORDER BY (SELECT NULL)) AS RowNo,*
FROM (SELECT top 3 name from sys.all_views ORDER BY NEWID()) T
) cs
所以,请帮忙。
注意:这是 NOT 关于MySQL的T-SQL,因为它们的语法不同,因此解决方案不同< / em>以及。
答案 0 :(得分:2)
将Row_number
添加到外部查询。试试这个
SELECT Row_number()OVER(ORDER BY (SELECT NULL)),*
FROM (SELECT TOP 3 MyId
FROM MyTable
ORDER BY Newid()) a
TOP
之后处理逻辑Select
关键字。生成行号后,将随机抽取3条记录。所以你不应该在原始查询中生成行号
更新
可以通过CROSS APPLY
来实现。将cross apply where
子句中的列名替换为Person
table
SELECT *
FROM Person p
CROSS apply (SELECT Row_number()OVER(ORDER BY (SELECT NULL)) rn,*
FROM (SELECT TOP 3 MyId
FROM MyTable
WHERE p.some_col = p.some_col -- Replace it with some column from person table
ORDER BY Newid())a) cs