2011-11-04 17 views
9

Questo sembra proprio così strano per me:Come può una query SQL avere due da clausole?

delete from [GearsDev].[dbo].[Products] 
from [GearsDev].[dbo].[Products] as C 
inner join #common M 
    on M.item = C.ItemNumber 

Il #Common è una tabella temporanea, ma il resto non ha senso per me. Come puoi avere due mondi? Si prega di aiutare un noob out.

risposta

12

Come si può vedere dalla documentazione di DELETE, possono essere necessarie due clausole FROM.

La prima FROM:

DA: è una parola chiave opzionale che può essere utilizzato tra la parola chiave DELETE e la table_or_view_name bersaglio, o rowset_function_limited.

La seconda FROM:

FROM <table_source>: Specifica un ulteriore clausola FROM. Questa estensione Transact-SQL su DELETE consente di specificare i dati e di eliminare le righe corrispondenti dalla tabella nella prima clausola FROM.

Questa estensione, che specifica un join, può essere utilizzata al posto di una sottoquery nella clausola WHERE per identificare le righe da rimuovere.

Così, l'SQL eliminerà record dalla Products tabella che hanno una voce corrispondente quando si è unita con #common.

Ciò equivale (in senso) per la seguente query:

delete from [GearsDev].[dbo].[Products] 
where ItemNumber in 
(
    select item from #common 
) 
+0

Buona risposta e grazie per il link. – broke

2

è possibile vincolare il set di record che si desidera eliminare da più di una tabella. Il secondo from genera semplicemente l'alias C per la tabella da cui si elimina, lo unisce alla tabella #common ed elimina solo i record che hanno un record in talea #common.

1

Da MSDN Il secondo da consente di creare un filtro che le righe corrispondenti nel primo da vengono eliminate in cui corrispondono.

In questo caso Elimina tutto [GearsDev]. [Dbo]. [Prodotti] dove ItemNumber ha una riga corrispondente nella #Common con la voce dello stesso valore

Problemi correlati