#sql #sql-server #sql-server-2008 #tsql
#sql #sql-server #sql-server-2008 #tsql
Вопрос:
Для меня это выглядит так странно:
delete from GearsDev.dbo.Products
from GearsDev.dbo.Products as C
inner join #Common as M
on M.item = C.ItemNumber
#Common
это временная таблица, но остальная ее часть для меня не имеет смысла.
Как у вас может быть два from
предложения?
Ответ №1:
Как видно из документации DELETE , он может принимать два FROM
предложения.
Первое FROM
:
FROM: необязательное ключевое слово, которое может использоваться между ключевым словом DELETE и целевым table_or_view_name или rowset_function_limited.
Второй FROM
:
FROM <table_source>
: Указывает дополнительное предложение FROM. Это расширение Transact-SQL для УДАЛЕНИЯ позволяет указывать данные из и удалять соответствующие строки из таблицы в первом предложении FROM.Это расширение, определяющее соединение, может использоваться вместо подзапроса в предложении WHERE для определения строк, подлежащих удалению.
Таким образом, SQL удалит записи из Products
таблицы, которые имеют соответствующий элемент, когда он соединяется с #common
.
Это эквивалентно (по смыслу) следующему запросу:
delete from [GearsDev].[dbo].[Products]
where ItemNumber in
(
select item from #common
)
Ответ №2:
Вы можете ограничить набор записей, которые хотите удалить, более чем одной таблицей. Второй from
просто генерирует псевдоним C
для таблицы, из которой вы удаляете, соединяет его с таблицей #common
и удаляет только записи, которые имеют запись в talbe #common
.
Ответ №3:
Из MSDN Второе из позволяет создать фильтр, который удаляет соответствующие строки в первом из, где они совпадают.
В этом случае удалите все [GearsDev].[dbo].[Products] где ItemNumber имеет соответствующую строку в #Common с элементом того же значения