Muszę zaktualizować tę tabelę w programie SQL Server danymi z jej tabeli „nadrzędnej”, patrz poniżej:
Tabela: sprzedaż
id (int)
udid (int)
assid (int)
Tabela: ud
id (int)
assid (int)
sale.assid
zawiera poprawną wartość do aktualizacji ud.assid
.
Jakie zapytanie to zrobi? Myślę o, join
ale nie jestem pewien, czy to możliwe.
sql
sql-server
tsql
sql-server-2005
sql-update
Ant Swift
źródło
źródło
Odpowiedzi:
Składnia ściśle zależy od używanego SQL DBMS. Oto kilka sposobów, aby to zrobić w ANSI / ISO (aka powinien działać na dowolnym SQL DBMS), MySQL, SQL Server i Oracle. Należy pamiętać, że moja sugerowana metoda ANSI / ISO będzie zwykle znacznie wolniejsza niż dwie pozostałe metody, ale jeśli używasz SQL DBMS innego niż MySQL, SQL Server lub Oracle, może to być jedyna droga (np. jeśli Twój SQL DBMS nie obsługuje
MERGE
):ANSI / ISO:
MySQL:
SQL Server:
PostgreSQL:
Pamiętaj, że tabeli docelowej nie wolno powtarzać w
FROM
klauzuli dotyczącej Postgres.Wyrocznia:
SQLite:
źródło
set assid = s.assid
powinien byćset u.assid = s.assid
.=
zwróci więcej niż jeden wiersz?update ud set assid = s.assid
Powinno to działać w programie SQL Server:
źródło
postgres
źródło
Byłoby to standardowe podejście SQL
Na SQL Server możesz użyć sprzężenia
źródło
WHERE
klauzuli, jeśli chcesz dopasować dodatkowe kolumny.PostgreSQL :
źródło
Uproszczone zapytanie o aktualizację przy użyciu JOIN -ing wielu tabel.
Uwaga - pierwsza_tabela, druga_tabela, trzecia_tabela i jakaś kolumna jak 123456 to nazwy tabel demonstracyjnych, nazwy kolumn i identyfikatory. Zastąp je prawidłowymi nazwami.
źródło
Kolejny przykład, dlaczego SQL nie jest tak naprawdę przenośny.
W przypadku MySQL byłoby to:
Aby uzyskać więcej informacji, przeczytaj aktualizację wielu tabel: http://dev.mysql.com/doc/refman/5.0/en/update.html
źródło
Teradata Aster oferuje kolejny ciekawy sposób na osiągnięcie celu:
źródło
Myślałem, że SQL Server z pierwszego posta będzie działał dla Sybase, ponieważ oba są T-SQL, ale niestety nie.
W przypadku Sybase zauważyłem, że aktualizacja musi znajdować się w tabeli, a nie w aliasie:
źródło
Poniższa instrukcja ze słowem kluczowym FROM służy do aktualizacji wielu wierszy za pomocą sprzężenia
źródło
MySQL
Najlepsze wyniki uzyskasz, jeśli zapomnisz klauzulę where i umieścisz wszystkie warunki w wyrażeniu ON.
Myślę, że dzieje się tak, ponieważ zapytanie najpierw musi dołączyć do tabel, a następnie uruchamia na nim klauzulę where, więc jeśli możesz zmniejszyć liczbę wymaganych elementów do przyłączenia, jest to najszybszy sposób na uzyskanie wyników / wykonanie udpate.
Przykład
Scenariusz
Masz tabelę użytkowników. Mogą zalogować się przy użyciu swojej nazwy użytkownika lub adresu e-mail lub numeru konta. Te konta mogą być aktywne (1) lub nieaktywne (0). Ta tabela ma 50000 wierszy
Następnie masz tabelę użytkowników do wyłączenia za jednym razem, ponieważ dowiadujesz się, że wszyscy zrobili coś złego. Ta tabela ma jednak jedną kolumnę zawierającą nazwy użytkowników, e-maile i numery kont. Ma także wskaźnik „has_run”, który należy ustawić na 1 (prawda) po uruchomieniu
Pytanie
Rozumowanie
Gdybyśmy musieli dołączyć tylko warunki OR, w zasadzie musielibyśmy sprawdzać każdy wiersz 4 razy, aby zobaczyć, czy powinien się połączyć, i potencjalnie zwracać znacznie więcej wierszy. Jednak dając mu więcej warunków, może „pominąć” wiele wierszy, jeśli nie spełniają wszystkich warunków podczas łączenia.
Premia
Jest bardziej czytelny. Wszystkie warunki są w jednym miejscu, a wiersze do aktualizacji są w jednym miejscu
źródło
I w MS ACCESS:
źródło
Najprostszym sposobem jest użycie Common Table Expression (CTE) wprowadzonego w SQL 2005
źródło
źródło
Spróbuj tego, myślę, że to zadziała dla ciebie
źródło
W przypadku SQLite użyj właściwości RowID, aby dokonać aktualizacji:
źródło