对于像这样的简单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的问题是,
显然,应该添加1、2和3的拾取/行数 而且不明显的是,上面的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
所以,请帮忙。
注:这是不是关于MySQL BYT T-SQL作为它们的语法是不同的,因此该解决方案是不同的,以及。
添加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。用表中的where有效列名替换cross apply子句中的列名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