2013-03-18 18 views
8

Jestem nowy w SQL, używając Microsoft SQL Server Management Studio.Aktualizacja SQL po połączeniu dwóch tabel

Próbuję napisać instrukcję SQL, która wykonuje aktualizację po połączeniu dwóch tabel.

Mam dwie tabele: myTable1 i myTable2. Oba mają wspólne pole MyID, które będzie polem, do którego dołączam. myTable1 zawiera kolumnę o nazwie BitToUpdate. I MyTable2 zawiera kolumnę o nazwie BitToCheck.

Chcę ustawić BitToUpdate w myTable1 na 1, gdzie BitToCheck w myTable2 jest również 1.

Oto co mam:

SELECT M.MyID, BitToUpdate, BitToCheck 
INTO #temp_table 
FROM myTable1 as T1 
LEFT JOIN myTable2 as T2 
ON M.MyId = PO.MyId 

Więc najpierw próbowałem połączyć dwie tabele myTable1 i myTable2 na ich identyfikatory i zapisać wynik w tabeli tymczasowej.

Następnie chcę zaktualizować BitToUpdate być 1, gdzie BitToCheck to 1.

Więc to zrobić w tabeli tymczasowej, mam:

UPDATE #temp_table 
SET 
    `BitToUpdate` = 1 
WHERE 
    `BitToCheck` = 1 

ten aktualizuje BitToUpdate powodzeniem w #temp_table . Jednak gdy wybiorę opcję myTable1, stwierdzam, że BitToUpdate nie została zmieniona. Przypuszczam, że ma to sens, ponieważ #temp_table nie jest tak naprawdę "wskaźnikiem" ...

Ale jaki byłby właściwy sposób podejścia do tego sprzężenia i aktualizacji?

Odpowiedz

13

Nie trzeba używać LEFT JOIN tutaj, ponieważ jesteś sprawdzania stanu z tabeli 2, więc INNER JOIN powinien być tu lepszym.

UPDATE T1 
SET T1.BitToUpdate = 1 
FROM myTable1 T1 
INNER JOIN myTable2 T2 
    ON T1.MyId = T2.MyId 
WHERE T2.BitToCheck = 1 
+0

to jest złe, zajrzyj do tego http://stackoverflow.com/questions/15209414/how-to-use-join-in-update-query Kolejność to: Update -> JOIN -> SET – Hendyanto

+0

W przypadku, gdy ktoś się tym przejmuje: powyższe zapytanie nie jest błędne. W MS SQL możesz wykonać UPDATE -> JOIN -> SET lub UPDATE -> SET -> FROM -> JOIN ... lub nawet UPDATE -> SET -> FROM -> WHERE .. . –

4

W pierwszym zapytaniu aktualizujesz tabelę tymczasową o nazwie #temp. aktualizacje nigdy nie przechodzą do rzeczywistej tabeli myTable1 lub mayTable2. Aby zaktualizować rekordy podczas łączenia z innymi tabelami spróbuj tego:

UPDATE T1 
SET T1.BitToUpdate = 1 
FROM myTable1 as T1 
LEFT JOIN myTable2 as T2 (ON T1.MyId = T2.MyId) 
WHERE T2.BitToCheck = 1 
+0

+1 do wyjaśnienia – Lamak

1
--SELECT M.MyID, BitToUpdate, BitToCheck 
--INTO #temp_table 
update t1 
    set t1.BitToUpdate = 1 
FROM myTable1 as T1 
LEFT JOIN myTable2 as T2 
ON t1.MyId = t2.MyId 
where t2.bittocheck = 1 
0
UPDATE T1 
SET BitToUpdate=1 
FROM myTable1 T1 
LEFT JOIN myTable2 T2 
ON T1.MyId=T2.MyId 
WHERE T2.BitToCheck=1 
Powiązane problemy