gpt4 book ai didi

sql - 内循环连接失败

转载 作者:行者123 更新时间:2023-12-04 04:32:54 25 4
gpt4 key购买 nike

我需要更新一个名为 FamName 的字段在名为 Episode 的表中从另一个名为 Surnames 的表中随机生成的日耳曼名称它有一个名为 Surname 的列.

为此,我首先添加了一个 ID场和 NONCLUSTERED INDEX到我的 Surnames

ALTER TABLE Surnames 
ADD ID INT NOT NULL IDENTITY(1, 1);
GO
CREATE UNIQUE NONCLUSTERED INDEX idx ON Surnames(ID);
GO

然后我尝试更新我的 Episode表通过
UPDATE E  
SET E.FamName = S.Surnames
FROM Episode AS E
INNER LOOP JOIN Surnames AS S
ON S.ID = (1 + ABS(CRYPT_GEN_RANDOM(8) % (SELECT COUNT(*) FROM Surnames)));
GO

我正在尝试使用 LOOP 强制查询“循环”加入提示。当然,如果我不强制优化器循环(使用 LOOP ),我将为所有行获得相同的德语名称。但是,此查询奇怪地返回受影响的零行。

为什么这会返回零个受影响的行,以及如何修改它才能工作?

注意,我可以使用 WHILE循环来执行此更新,但我想要一种简洁的方法来执行此操作并找出在这种特殊情况下我做错了什么。

最佳答案

您不能(可靠地)使用连接提示影响查询结果。它们是性能提示,而不是语义提示。您尝试依赖未定义的行为。

将随机数计算从连接条件移到连接源之一可防止将表达式视为常量:

UPDATE E  
SET E.FamName = S.Surnames
FROM (
SELECT *, (1 + ABS(CRYPT_GEN_RANDOM(8) % (SELECT COUNT(*) FROM Surnames))) AS SurnameID
FROM Episode AS E
) E
INNER LOOP JOIN Surnames AS S ON S.ID = E.SurnameID

派生表 E添加计算的 SurnameID作为一个新列。

您不再需要加入提示。我只是测试了这在我的特定测试用例中是否有效,尽管我不确定这是否保证有效。

关于sql - 内循环连接失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20286037/

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