Как запрос SQL может содержать два предложения from?

#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 с элементом того же значения