2013-02-27 19 views
7

Query:Aggiornamento da Temp Tabella

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) 

Principalmente, ho bisogno di copiare i dati da un campo OUT XML ai campi normali all'interno della stessa tabella.

Domande:

  1. alcuna ragione per cui tutti i record ottenere il homeAddress su Table1?
  2. Cursore è davvero l'unico modo per aggiornare il valore su Tabella1?
+0

possibile duplicato di [Aggiornare una tabella utilizzando JOIN in SQL Server?] (Http: //stackoverflow.com/questions/1604091/update-a-table-using-join-in-sql-server) –

risposta

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

Utilizzare un join. Non c'è bisogno di tabella temporanea o sottoquery correlata.

Se la tabella 1 si trova in un rapporto uno a molti, ci sono alcune possibilità per gestirlo. Se si havea valore che indica uno ed un solo record (abbiamo un campo nel nostro sistema che preleva l'indirizzo più importante, è mantenuto con un trigger per garantire uniquesness), la prova questo:

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 

Se necessità di base del record unico in asome altro campo (come la data più recente), quindi provare una variante di questo:

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

Se t1.id ha una relazione uno a molti con t2.homeaddressid, potrebbe essere necessario un po 'di più specifico su quale record usare. –

+0

i valori reali si trovano all'interno di un campo XML. Ho appena aggiornato la domanda originale. –

+0

@DanBracuk, punto eccellente. Ovviamente la versione corrente non specifica quale usare in quel caso. Lasciatemi fare alcuni esempi. – HLGEM

2

l'aggiornamento, ho bisogno di qualificare completamente la tabella come segue:

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

Problemi correlati