加入(应用)随机行

问题描述 投票:0回答:1

这是我用来测试连接随机行如何工作的查询:

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

我想知道为什么。

sql-server random
1个回答
0
投票

只需发布@ThomA 评论作为正确答案:

由于您的子查询不相关,数据引擎可能 足够“聪明”知道只需要运行子查询 一次即可得到结果集。结果,因为它只运行一次 那么外部查询中的每一行都会得到相同的行。 –

旁注,syscolumns 是 SQL Server 2000 数据库的一个对象;你 现在真的应该使用 sys.columns 了。

© www.soinside.com 2019 - 2024. All rights reserved.