2013-02-27 12 views
7

zapytanie:Aktualizacja z Temp tabeli

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) 

Głównie muszę skopiować dane OUT z pola XML do normalnych pól w tej samej tabeli.

Pytania:

  1. jakiś powód dlaczego wszystkie rekordy uzyskać HomeAddress na Table1?
  2. Czy naprawdę kursor jest jedynym sposobem aktualizacji wartości w tabeli 1?
+0

możliwe duplikat [aktualizacji tabeli poprzez dołączanie SQL Server?] (Http: //stackoverflow.com/questions/1604091/update-a-table-using-join-in-sql-server) –

Odpowiedz

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

Użyj łączenia. Nie ma potrzeby stosowania tabeli tymczasowej ani skorelowanego podzapytania.

Jeśli tabela 1 zawiera od jednego do wielu relacji, to istnieją pewne możliwości ich obsługi. Jeśli havea wartość wskazującą jeden i tylko jeden rekord (mamy pole w naszym systemie, które odbiera najważniejszą adres, jest utrzymywany z wyzwalaczem zagwarantować uniquesness), przy czym to spróbuj:

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 

Jeśli trzeba na bazie unikalnego rekordu na Asome innej dziedzinie (jak najbardziej aktualne), a następnie spróbuj odmianę tego:

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

Jeśli t1.id ma relację jeden do wielu z t2.homeaddressid, być może trzeba będzie trochę więcej specyficzne dla jakiego rekordu użyć. –

+0

prawdziwe wartości są w polu XML. Właśnie zaktualizowałem oryginalne pytanie. –

+0

@ DanBracuk, doskonały punkt. Oczywiście obecna wersja nie określa, które z nich należy użyć w tym przypadku. Pozwólcie, że chociaż przytoczę kilka przykładów. – HLGEM

2

na aktualizację, muszę w pełni zakwalifikować Tabela następująco:

UPDATE TABLE1
SET TABLE1.HomeAddress = (SELECT Top 1 t.Address
Z #TMP t
GDZIE t.ID = TABLE1.ID)

Powiązane problemy