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

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

以下是测试案例

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

sql tsql join sql-update case
1个回答
0
投票

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

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

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