更新时的情况(一行与多行连接)–执行计划问题

以下是测试案例

IF OBJECT_ID('tempdb..#a') IS NOT NULL
    DROP TABLE #a

IF OBJECT_ID('tempdb..#b') IS NOT NULL
    DROP TABLE #b

CREATE TABLE #a (
    [Value] NVARCHAR(MAX),
    [PickedPriority] NVARCHAR(MAX)
)

INSERT INTO #a([Value])
VALUES('Test')

CREATE TABLE #b (
    [RowId] INT IDENTITY(1,1),
    [ColumnMiddlePriority] NVARCHAR(MAX),
    [ColumnTopPriority] NVARCHAR(MAX),
    [ColumnLowPriority] NVARCHAR(MAX),
    PRIMARY KEY([RowId])
)
INSERT INTO #b([ColumnLowPriority])
VALUES(N'Test')
INSERT INTO #b([ColumnTopPriority])
VALUES(N'Test')
INSERT INTO #b([ColumnMiddlePriority])
VALUES(N'Test')

UPDATE A
SET
    A.[PickedPriority] = CASE 
        WHEN B.[ColumnTopPriority] = A.[Value] THEN N'TOP' 
        WHEN B.[ColumnMiddlePriority] = A.[Value] THEN N'MIDDLE' 
        WHEN B.[ColumnLowPriority] = A.[Value] THEN N'LOW' 
        END
FROM #a A
    INNER JOIN #b B ON (
        A.[Value] = B.[ColumnLowPriority]
        OR A.[Value] = B.[ColumnTopPriority]
        OR A.[Value] = B.[ColumnMiddlePriority]
    )

产生的结果。PickedPriority总是TOP,即使我尝试改变#b表的插入顺序。

当我检查执行计划时,我可以理解为什么:在匹配了A行和B行后,操作了一个GROUP BY,然后从左到右测试的情况下,做了一些技巧,但是这里的结果是确定的吗?

不同的执行计划是否会有不同的结果?

enter image description here

解决方案:

我在这篇文章中找到了答案。https:/sqlperformance.com201907sql-performancethe-any-aggregate-is-broken。 和文件中https:/docs.microsoft.comen-ussqlt-sqlqueriesupdate-transact-sql?view=sql-server-2017#best-practices。

所以没有,在我的情况下(更新语句中多行匹配一行),根本不是确定性的。

给TA打赏
共{{data.count}}人
人已打赏
未分类

nohup: 忽略输入,但我的python程序确实需要输入。

2022-9-8 16:52:38

未分类

试图更新Azure B2C上的用户时,出现 "权限不足 "的错误。

2022-9-8 16:52:40

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索