这是我用来测试连接随机行如何工作的查询:
SELECT TOP 10
Id = NEWID(),
UserId = x.Id
FROM
sys.syscolumns
CROSS APPLY (SELECT TOP 1 Id FROM [User] ORDER BY NEWID()) x
这是结果示例:
A45A30C7-9F11-4669-9477-81371B1F195A 47
49C460AE-E27E-402D-B958-2F1A9AC683E5 47
F538A29E-85EC-4FEE-9B5A-EAFEAF6D5BED 47
674CCA56-36D8-4EA1-83E5-D66827190875 47
80702A1C-8C0A-475A-A21E-001B880FE3E5 47
5897DFFE-3EA6-4CD4-BF67-97E23D4AD518 47
A49046CD-7EAF-4806-8A68-A3676A39DB2D 47
7A057F35-63F7-4FDF-B0EF-FCB80CFBB8DD 47
7C287C70-0743-4A74-AC16-5F23448BB420 47
3401B892-F61A-42EF-9B35-DF836184D205 47
不幸的是,从 [User] 表应用到 sys.syscolumns 的所有行都是相同的。
我也尝试过使用
RAND(CHECKSUM(NEWID()))
作为子句,但不起作用。
如果我添加一个像这样的奇怪子句,它就会起作用:
SELECT TOP 10
Id = NEWID(),
UserId = x.Id
FROM
sys.syscolumns sc
CROSS APPLY (SELECT TOP 1 Id FROM [User] u WHERE sc.name = sc.name ORDER BY NEWID()) x
我想知道为什么。
只需发布@ThomA 评论作为正确答案:
由于您的子查询不相关,数据引擎可能 足够“聪明”知道只需要运行子查询 一次即可得到结果集。结果,因为它只运行一次 那么外部查询中的每一行都会得到相同的行。 –
旁注,syscolumns 是 SQL Server 2000 数据库的一个对象;你 现在真的应该使用 sys.columns 了。