xpt*_*xpt 0 sql t-sql sql-server
对于像这样的简单 SQL,
SELECT top 3 MyId FROM MyTable ORDER BY NEWID()
Run Code Online (Sandbox Code Playgroud)
如何向它们添加行号,使行号变为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
Run Code Online (Sandbox Code Playgroud)
上述 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
Run Code Online (Sandbox Code Playgroud)
所以,请帮忙。
注意:这与 MySQL byt-SQL 无关,因为它们的语法不同,因此解决方案也不同。
添加Row_number到外部查询。尝试这个
SELECT Row_number()OVER(ORDER BY (SELECT NULL)),*
FROM (SELECT TOP 3 MyId
FROM MyTable
ORDER BY Newid()) a
Run Code Online (Sandbox Code Playgroud)
逻辑上TOP关键字是在 后处理的Select。生成行号后,将随机抽取 3 条记录。所以你不应该在原始查询中生成行号
更新
可以通过 来实现CROSS APPLY。将交叉应用子句中的列名替换where为Person表中的有效列名
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6470 次 |
| 最近记录: |