Составные имена столбцов в операторе обновления с помощью select - PullRequest
0 голосов
/ 04 ноября 2019

Я уверен, что это может быть дубликат, но я не могу найти нужную поисковую фразу.

Учитывая, что таблица в именованной схеме (т.е. не dbo) требует, чтобы вы включили имя схемы взаявление. Итак, ранее я просто написал бы это так:

UPDATE [Schema].[Table1]
SET [AColumn] = 
( 
    SELECT [SomeColumn] 
    FROM [Schema].[Table2] 
    WHERE [Schema].[Table2].[SameColumnName] = [Schema].[Table1].[SameColumnName] 
);

Но поскольку More than two-part column name устарело, мне нужно найти новый способ сделать это, что является подтверждением будущего. Я предложил 2 варианта, во-первых, используя псевдоним:

UPDATE [Alias1]
SET [AColumn] = 
( 
    SELECT [SomeColumn] 
    FROM [Schema].[Table2] [Alias2] 
    WHERE [Alias2].[SameColumnName] = [Alias1].[SameColumnName] 
)
FROM [Schema].[Table1] [Alias1];

Второй способ - это то, что мне действительно трудно определить, действительно ли это VALID T-Sql:

UPDATE [Schema].[Table1]
SET [AColumn] = 
( 
    SELECT [SomeColumn] 
    FROM [Schema].[Table2] 
    WHERE [Table2].[SameColumnName] = [Table1].[SameColumnName] 
);

Я проверил и то, и другое, и они работают, поэтому мой вопрос в том, является ли второй полностью допустимым и нормальным использовать только имя таблицы без Schema в этом смысле, или мне лучше выбратьчуть более многословный Alias?

1 Ответ

2 голосов
/ 04 ноября 2019

Как я уже сказал в своем комментарии, псевдоним ваших объектов.

SELECT MT.MyColumn,
       YT.MyColumn
FROM dbo.MyTable MT
     JOIN so.YourTable YT ON MT.ID = YT.fID
WHERE YT.[name] = N'Jane';

Если вы выполняете UPDATE, укажите псевдоним объекта для обновления:

UPDATE MT
SET MyColumn = YT.MyColumn --Column on the left side of the SET will always reference the table being updated
FROM dbo.MyTable MT
     JOIN so.YourTable YT ON MT.ID = YT.fID
WHERE YT.[name] = N'Jane';
...