2013-02-27 7 views
7

Abfrage:Update von Temp-Tabelle

SELECT ID, T.c.value('@Address', 'nvarchar(20)') as Address 
INTO #TMP 
FROM TABLE1 
    CROSS APPLY XMLData.nodes('/Document') AS T(c) 

UPDATE TABLE1 
SET HomeAddress = (SELECT TOP 1 t.Address 
        FROM #TMP t 
        WHERE t.ID = ID) 

Vor allem muß ich Daten aus einem XML-Feld in den normalen Feldern innerhalb der gleichen Tabelle kopieren.

Fragen:

  1. Gibt es Gründe, warum alle Datensätze, die auf Tabelle 1 homeaddress bekommen?
  2. Ist wirklich Cursor der einzige Weg, um den Wert auf Table1 zu aktualisieren?
+0

möglich Duplikat [Aktualisieren einer Tabelle in SQL Server mit JOIN?] (Http: //stackoverflow.com/questions/1604091/update-a-table-using-join-in-sql-server) –

Antwort

17
UPDATE T2 
SET HomeAddress = t1.address 
FROM TABLE2 t2 
join TABLE1 t1 on T1.ID = t2.HomeAddressID 
and t2.HomeAddress <> t1.address 

Verwenden Sie einen Join. Keine Notwendigkeit, temporäre oder korrelierte Unterabfragen zu erstellen.

Wenn Tabelle 1 in einem eins zu viele relationshis ist, sind das einige posibilites für die Handhabung. Wenn Sie Wert havea, das ein und nur ein Datensatz zeigt (wir ein Feld in unserem System haben, das die wichtigste Adresse nimmt, wird er mit einem Abzug durch uniquesness zu gewährleisten), das ist der Versuch:

UPDATE T2 
SET HomeAddress = t1.address 
FROM TABLE2 t2 
join TABLE1 t1 on t1.ID = t2.HomeAddressID 
WHERE t1.somefield = 'somevalue' 
and t2.HomeAddress <> t1.address 

Wenn Sie müssen auf Basis der einzigartigen Datensatz auf asome anderen Feld (wie dem jüngsten Datum), dann versuchen, eine Variation davon:

UPDATE T2 
SET HomeAddress = t1.address 
FROM TABLE2 t2 
join TABLE1 t1 on t1.ID = t2.HomeAddressID 
join (select id, max(somedatefield) from table1 group by id) t3 on t3.id = t1.id 
Where t2.HomeAddress <> t1.address 
+2

Wenn t1.id eine Eins-zu-viele-Beziehung mit t2.homeaddressid hat, müssen Sie vielleicht ein bisschen mehr sein Spezifisch auf welchen Datensatz zu verwenden. –

+0

Die tatsächlichen Werte befinden sich in einem XML-Feld. Ich habe gerade die ursprüngliche Frage aktualisiert. –

+0

@DanBracuk, ausgezeichneter Punkt. Natürlich gibt die aktuelle Version nicht an, welches in diesem Fall zu verwenden ist. Lass mich doch ein paar Beispiele zusammenbauen. – HLGEM

2

auf dem Update muss ich voll und ganz die Tabelle wie folgt QUALIFY:

UPDATE TABLE1
SET TABLE1.HomeAddress = (SELECT TOP 1 t.Address
VON #tmp t
WHERE t.ID = TABLE1.ID)