Pourquoi cette instruction delete fonctionne-t-elle?

Dupliquer possible:
Comment une requête SQL peut-elle avoir deux clauses from?

delete from machine_placement_group from (machine_group g left join config_chg_req r on g.machine_group_id = r.machine_group_id) join machine_placement_group mg on g.machine_group_id = mg.machine_group_id 

Je ne comprends pas les deux des déclarations.

Pour citer la documentation pour le second FROM:

FROM table_source

Spécifie une clause FROM supplémentaire. Cette extension Transact-SQL à DELETE permet de spécifier des données à partir de <table_source> et de supprimer les lignes correspondantes de la table dans la première clause FROM.

Cette extension, spécifiant une jointure, peut être utilisée à la place d'une sous-requête dans la clause WHERE pour identifier les lignes à supprimer.

Pour plus d'informations, voir FROM (Transact-SQL).

Donc, fondamentalement, il fait ce qu'il dit sur l'étain. Vous spécifiez un jeu de résultats supplémentaire à partir duquel datatables à supprimer dans la table d'origine sont déterminées.

Le premier est optionnel, le second n'est pas.

Par exemple, vous pouvez écrire

 delete from table1 where id = 10 

ou

 delete table1 where id = 10 

Mais si vous vous joignez à d'autres tables car cette requête est vous avez besoin de cette deuxième FROM.

Mon style préféré pour des choses comme ceci est d'utiliser l'alias, donc j'écrirais.

 delete g --select * from machine_group g left join config_chg_req r on g.machine_group_id = r.machine_group_id join machine_placement_group mg on g.machine_group_id = mg.machine_group_id 

Vous notez comment j'intègre un select dans l'instruction, cela vous permet de voir quels loggings seront supprimés avant d'exécuter le rapport en exécutant seulement de Select à la fin de la requête

Je pense que ça pourrait aussi être écrit comme

 delete machine_placement_group from machine_group g left join config_chg_req r on g.machine_group_id = r.machine_group_id join machine_placement_group mg on g.machine_group_id = mg.machine_group_id 

et fonctionne comme une déclaration valide comme

 Declare @Test Table (id int) insert into @Test values(1) delete dbo.Employee from @test g join dbo.Employee e on g.id=e.ID 

où une ligne est supprimée FROM testant la condition de jointure comme

 delete dbo.Employee from @test g