Aggiorna domanda di subquery, con chiave esterna
-
19-08-2019 - |
Domanda
Ho dimenticato di ricordare quale fosse la chiave per questa tabella di modelli e quindi ho aggiunto il campo sbagliato come chiave esterna. Ora devo aggiungere la chiave esterna e voglio popolare i suoi valori in base a questo altro campo già popolato. Ho iniziato a provare a farlo con una dichiarazione di aggiornamento, ma non sono sicuro su come farlo.
Parte del mio schema:
Tabella prodotti:
ProductName (key)
TemplateName
TemplateID
...
Ho aggiunto TemplateID, ma non contiene ancora dati ed è nullable.
Tabella dei modelli:
TemplateID (key)
TemplateName
...
Voglio utilizzare la tabella Modelli per trovare il TemplateID corrispondente per ciascun TemplateName nella tabella Prodotti e riempirlo nel riferimento di chiave esterna nella tabella Prodotti.
Posso farlo con una sottoquery in Update o devo scrivere una specie di Proc memorizzato? Sto usando SQL Server 2008
Soluzione
Puoi farlo con una semplice query UPDATE
UPDATE Products
SET Products.TemplateID = Templates.TemplateID
FROM Templates
WHERE Templates.TemplateName = Products.TemplateName
Non è necessario specificare la tabella Products nella clausola FROM, né una clausola JOIN. Basta specificare la tabella Modelli nella clausola FROM. Puoi utilizzare il nome di tabl che usi nella clausola UPDATE della clausola WHERE, per correlare i record di entrambe le tabelle.
Altri suggerimenti
Ecco una soluzione di join. È significativo in quanto verranno aggiornate solo le righe corrispondenti.
Update p
Set p.TemplateId = t.TemplateId
From Products p
join Templates t
On p.TemplateName = t.TemplateName
Ecco la soluzione di subquery. Ogni riga di prodotti verrà aggiornata, anche in assenza di corrispondenza.
Update p
Set p.TemplateId =
(
Select t.TemplateId
From Templates t
Where p.TemplateName = t.TemplateName
)
From Products p
update Templates
set TemplateId=Products.TemplateId
from Templates
inner join Products
on Templates.TemplateName=Products.TemplateName