Следующий тестовый пример
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 здесь?
Может ли другой план выполнения привести к другому результату?