Обновление в случае, когда (одна строка соединена с несколькими строками) - вопрос плана выполнения - PullRequest
0 голосов
/ 23 апреля 2020

Следующий тестовый пример

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.

Когда я проверяю план выполнения, я могу понять, почему: GROUP BY работает после сопоставления строк A и B, затем слева направо тестирование случая, когда выполняется трюк, но это детерминированный результат c здесь?

Может ли другой план выполнения привести к другому результату?

enter image description here

1 Ответ

0 голосов
/ 24 апреля 2020

Я нашел свой ответ в этой статье: https://sqlperformance.com/2019/07/sql-performance/the-any-aggregate-is-broken и в документации https://docs.microsoft.com/en-us/sql/t-sql/queries/update-transact-sql?view=sql-server-2017#best -практики

Так что нет, в моем случае ( несколько строк, совпадающих с одной строкой в ​​операторе обновления), вообще не определено c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...