Frage

ich misremembered was war der Schlüssel für diese Tabelle Vorlagen und deshalb habe ich das falsche Feld als Fremdschlüssel. Jetzt muß ich den Fremdschlüssel hinzuzufügen, und ich mag ihre Werte füllen basierend auf diesem anderen Feld, das bereits aufgefüllt wird. Ich begann versucht, dies mit einer Update-Anweisung zu tun, aber ich bin nicht sicher, wie es zu tun.

Ein Teil meines Schema:

Produkte Tabelle:

ProductName (key)
TemplateName
TemplateID
...

Ich habe TemplateID hinzugefügt, aber es hat in ihm noch keine Daten und NULL-Werte zugelassen.

Vorlagen Tabelle:

TemplateID (key)
TemplateName
...

Ich mag die Vorlagen Tabelle verwenden, die passende TemplateID für jeden Template in der Tabelle Artikel zu finden, und dass in der Tabelle Artikel in der Fremdschlüsselreferenz füllen.

Kann ich das mit einer Unterabfrage in einem Update, oder brauche ich eine Art von Stored Proc zu schreiben? Ich bin mit SQL Server 2008

War es hilfreich?

Lösung

Sie können es mit einer einfachen UPDATE-Abfrage tun

UPDATE Products
SET Products.TemplateID = Templates.TemplateID
FROM Templates
WHERE Templates.TemplateName = Products.TemplateName

Sie brauchen nicht auf die Tabelle Artikel in der FROM-Klausel angeben, noch eine JOIN-Klausel. Geben Sie einfach den Vorlagen-Tabelle in der FROM-Klausel. Sie können den Tabellennamen verwenden Sie in der UPDATE-Klausel in der WHERE-Klausel verwenden, recordds aus beiden Tabellen zu korrelieren.

Andere Tipps

Hier ist eine Lösung kommen. Es ist bedeutsam, dass nur die entsprechende Datensätze aktualisiert werden.

Update p
Set p.TemplateId = t.TemplateId
From Products p
  join Templates t
  On p.TemplateName = t.TemplateName

Hier ist die Unterabfrage Lösung. Jede Zeile der Produkte werden, aktualisiert werden, selbst wenn es keine Übereinstimmung gibt.

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top