gpt4 book ai didi

sql - 如何获得在 CTE 中生成的随机数而不在 JOIN 中更改?

转载 作者:行者123 更新时间:2023-12-01 13:15:46 25 4
gpt4 key购买 nike

问题

我正在为表中的每一行生成一个随机数 #Table_1在 CTE 中,使用 this technique .然后,我将在另一个表上加入 CTE 的结果,#Table_2 .而不是为 #Table_1 中的每一行获取一个随机数,对于连接中的每个结果行,我都会得到一个新的随机数!

CREATE TABLE #Table_1 (Id INT)

CREATE TABLE #Table_2 (MyId INT, ParentId INT)

INSERT INTO #Table_1
VALUES (1), (2), (3)

INSERT INTO #Table_2
VALUES (1, 1), (2, 1), (3, 1), (4, 1), (1, 2), (2, 2), (3, 2), (1, 3)


;WITH RandomCTE AS
(
SELECT Id, (ABS(CHECKSUM(NewId())) % 5)RandomNumber
FROM #Table_1
)
SELECT r.Id, t.MyId, r.RandomNumber
FROM RandomCTE r
INNER JOIN #Table_2 t
ON r.Id = t.ParentId

结果
Id          MyId        RandomNumber
----------- ----------- ------------
1 1 1
1 2 2
1 3 0
1 4 3
2 1 4
2 2 0
2 3 0
3 1 3

想要的结果
Id          MyId        RandomNumber
----------- ----------- ------------
1 1 1
1 2 1
1 3 1
1 4 1
2 1 4
2 2 4
2 3 4
3 1 3

我试过的

我试图通过将随机数转换为 VARCHAR 来掩盖优化器生成随机数的逻辑。 ,但这没有用。

我不想做什么

我想避免使用临时表来存储 CTE 的结果。

如何在不使用临时存储的情况下为表生成随机数并在连接中保留该随机数?

最佳答案

这似乎可以解决问题:

WITH CTE AS(
SELECT Id, (ABS(CHECKSUM(NewId())) % 5)RandomNumber
FROM #Table_1),
RandomCTE AS(
SELECT Id,
RandomNumber
FROM CTE
GROUP BY ID, RandomNumber)
SELECT *
FROM RandomCTE r
INNER JOIN #Table_2 t
ON r.Id = t.ParentId;

看起来 SQL Server 意识到,在 CTE 之外, RandomNumber实际上只是 NEWID()用一些附加函数包裹它( DB<>Fiddle ),因此它仍然为每一行生成一个唯一的 ID。 GROUP BY因此,第二个 CTE 中的子句强制数据引擎定义 RandomNumber 一个值,以便它可以执行 GROUP BY .

关于sql - 如何获得在 CTE 中生成的随机数而不在 JOIN 中更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55269241/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com