W SQL Server możliwe jest INSERT
przejście do tabeli za pomocą SELECT
instrukcji:
INSERT INTO Table (col1, col2, col3)
SELECT col1, col2, col3
FROM other_table
WHERE sql = 'cool'
Czy można również aktualizować za pomocą SELECT
? Mam tymczasową tabelę zawierającą wartości i chciałbym zaktualizować inną tabelę przy użyciu tych wartości. Być może coś takiego:
UPDATE Table SET col1, col2
SELECT col1, col2
FROM other_table
WHERE sql = 'cool'
WHERE Table.id = other_table.id
sql
sql-server
tsql
select
jamesmhaley
źródło
źródło
SET Table.other_table_id = @NewValue
), zmień instrukcję ON na coś w styluON Table.id = @IdToEdit AND other_table.id = @NewValue
W SQL Server 2008 (lub nowszym) użyj
MERGE
Alternatywnie:
źródło
MERGE
może być również użyty do zapisu „Upserting”; to znaczy,UPDATE
jeśli istnieje pasujący rekord,INSERT
nowy rekord, jeśli nie znaleziono pasującegoUPDATE
niżMERGE
, ludzie mają po prostu nauczyli się żyć z nimi, a oni stają się częścią krajobrazu ( „cechami”). Pomyśl, że blogi nie istniały, kiedyUPDATE
był nowy dzieciak w bloku.źródło
SET Table_A.col1 = SUM(Table_B.col1)
(ani żadnej innej funkcji agregującej). Więc lepiej niż odpowiedź Robin Day na ten cel.Zmodyfikowałbym doskonałą odpowiedź Robin na następujące:
Bez klauzuli WHERE wpłyniesz nawet na wiersze, których nie trzeba zmieniać, co może (ewentualnie) spowodować ponowne obliczenie indeksu lub wyzwalacze ognia, które tak naprawdę nie powinny były zostać uruchomione.
źródło
WHERE EXISTS(SELECT T1.Col1, T1.Col2 EXCEPT SELECT T2.Col1, T2.Col2))
jest bardziej zwięzły.Jednokierunkowa
źródło
Inną nie wspomnianą jeszcze możliwością jest po prostu wrzucenie
SELECT
samej instrukcji do CTE, a następnie zaktualizowanie CTE.Ma to tę zaletę, że łatwe jest samodzielne uruchomienie
SELECT
instrukcji w celu sprawdzenia poprawności wyników, ale wymaga aliasu kolumn jak wyżej, jeśli mają one takie same nazwy w tabelach źródłowej i docelowej.Ma to również takie samo ograniczenie jak zastrzeżona
UPDATE ... FROM
składnia pokazana w czterech innych odpowiedziach. Jeśli tabela źródłowa znajduje się po wielu stronach złączenia jeden do wielu, nie jest deterministyczne, który z możliwych dopasowanych połączonych rekordów zostanie użyty wUpdate
(problem, którego możnaMERGE
uniknąć, zgłaszając błąd przy próbie aktualizacji ten sam rząd więcej niż raz).źródło
CTE
?;WITH SomeCompexCTE AS (...), CTEAsAbove AS (SELECT T1.Col1,... FROM T1 JOIN SomeComplexCTE...) UPDATE CTEAsAbove SET Col1=_Col1, ...
Dla przypomnienia (i innych szukających tak jak ja) możesz to zrobić w MySQL w następujący sposób:
źródło
Korzystanie z aliasu:
źródło
Najprostszym sposobem na to jest:
źródło
Może to być niszowy powód do przeprowadzenia aktualizacji (na przykład głównie używany w procedurze) lub może być oczywisty dla innych, ale należy również stwierdzić, że można wykonać instrukcję select-select bez użycia łączenia (w przypadku tabele, między którymi aktualizujesz, nie mają wspólnego pola).
źródło
Oto kolejna przydatna składnia:
Sprawdza, czy ma wartość zero, czy nie, używając „GDZIE ISTNIEJE”.
źródło
Dodam to tylko, abyś mógł zobaczyć, jak to szybko napisać, abyś mógł sprawdzić, co zostanie zaktualizowane przed wykonaniem aktualizacji.
źródło
Jeśli używasz MySQL zamiast SQL Server, składnia jest następująca:
źródło
AKTUALIZACJA od WYBIERZ z WEJŚCIEM WEWNĘTRZNYM w bazie danych SQL
Ponieważ jest zbyt wiele odpowiedzi na ten post, z których większość jest bardzo pozytywnie oceniona, pomyślałem, że również tutaj przedstawię moją sugestię. Chociaż pytanie jest bardzo interesujące, widziałem na wielu stronach forum i stworzyłem rozwiązanie za pomocą INNER JOIN ze zrzutami ekranu.
Na początku stworzyłem tabelę o nazwie schoolold i wstawiłem kilka rekordów w odniesieniu do nazw kolumn i wykonuję ją.
Następnie wykonałem polecenie SELECT, aby wyświetlić wstawione rekordy.
Następnie stworzyłem nową tabelę o nazwie schoolnew i podobnie wykonałem na niej powyższe akcje.
Następnie, aby wyświetlić wstawione w nim rekordy, wykonuję polecenie SELECT.
Teraz chcę wprowadzić zmiany w trzecim i czwartym rzędzie, aby zakończyć tę akcję, wykonuję polecenie UPDATE za pomocą INNER JOIN .
Aby wyświetlić zmiany, wykonuję polecenie SELECT .
Możesz zobaczyć, jak Trzeci i Czwarty rekord szkolnej tabeli łatwo zastąpiono szkolną tabelą , używając INNER JOIN z instrukcją UPDATE.
źródło
A jeśli chcesz dołączyć do stołu sam (co nie zdarza się zbyt często):
źródło
targett1
isourcet1
zamiast (lub również) komentarzy.W poniższym przykładzie użyto tabeli pochodnej, instrukcji SELECT po klauzuli FROM, aby zwrócić stare i nowe wartości dla dalszych aktualizacji:
źródło
Aktualizacja poprzez
CTE
jest bardziej czytelna niż inne odpowiedzi tutaj:źródło
Jeśli używasz programu SQL Server, możesz zaktualizować jedną tabelę z drugiej bez określania łączenia i po prostu połącz dwie z
where
klauzuli. To znacznie ułatwia zapytanie SQL:źródło
Skonsolidowanie wszystkich różnych podejść tutaj.
Przykładowa struktura tabeli znajduje się poniżej i zostanie zaktualizowana z Product_BAK do tabeli produktów.
Produkt
Product_BAK
1. Wybierz aktualizację
2. Zaktualizuj za pomocą wspólnego wyrażenia tabelowego
3. Scal
W tej instrukcji Merge możemy wprowadzić wstawkę, jeśli nie znajdzie pasującego rekordu w celu, ale istnieje w źródle i znajduje składnię:
źródło
Innym sposobem jest użycie tabeli pochodnej:
Przykładowe dane
źródło
Aby upewnić się, że aktualizujesz to, co chcesz, wybierz najpierw
źródło
Istnieje jeszcze krótsza metoda i może być dla Ciebie zaskakująca:
Przykładowy zestaw danych:
Kod:
źródło
Posługiwać się:
ZARÓWNO:
LUB:
Jeśli nazwa kolumny ID jest taka sama w obu tabelach, po prostu umieść nazwę tabeli przed tabelą do aktualizacji i użyj aliasu dla wybranej tabeli, tj .:
źródło
W zaakceptowanej odpowiedzi po:
Dodałbym:
To, co zwykle robię, to umieszczanie wszystkiego w transakcji wycofanej i używanie
"OUTPUT"
: w ten sposób widzę wszystko, co ma się wydarzyć. Kiedy jestem zadowolony z tego, co widzę, zmieniamROLLBACK
naCOMMIT
.Zwykle muszę dokumentować to, co zrobiłem, więc korzystam z tej
"results to Text"
opcji, gdy uruchamiam zapytanie wycofane i zapisuję zarówno skrypt, jak i wynik WYJŚCIA. (Oczywiście nie jest to praktyczne, jeśli zmieniłem zbyt wiele wierszy)źródło
źródło
Poniższe rozwiązanie działa z bazą danych MySQL:
źródło
Inny sposób aktualizacji z instrukcji select:
źródło
Opcja 1: Korzystanie z połączenia wewnętrznego:
Opcja 2: powiązane zapytanie podrzędne
źródło
Składnia instrukcji UPDATE podczas aktualizowania jednej tabeli danymi z innej tabeli w programie SQL Server
źródło
Możesz użyć tego do aktualizacji na serwerze SQL
źródło