Ich muss diese Tabelle in SQL Server mit Daten aus der übergeordneten Tabelle aktualisieren (siehe unten):
Tabelle: Verkauf
id (int)
udid (int)
assid (int)
Tabelle: ud
id (int)
assid (int)
sale.assid
enthält den richtigen zu aktualisierenden Wert ud.assid
.
Welche Abfrage wird dies tun? Ich denke an ein join
, bin mir aber nicht sicher, ob es möglich ist.
sql
sql-server
tsql
sql-server-2005
sql-update
Ant Swift
quelle
quelle
Antworten:
Die Syntax hängt streng davon ab, welches SQL-DBMS Sie verwenden. Hier sind einige Möglichkeiten, dies in ANSI / ISO (auch bekannt als SQL DBMS), MySQL, SQL Server und Oracle zu tun. Beachten Sie, dass meine vorgeschlagene ANSI / ISO-Methode in der Regel viel langsamer ist als die beiden anderen Methoden. Wenn Sie jedoch ein anderes SQL-DBMS als MySQL, SQL Server oder Oracle verwenden, ist dies möglicherweise der einzige Weg (z wenn Ihr SQL DBMS dies nicht unterstützt
MERGE
):ANSI / ISO:
MySQL:
SQL Server:
PostgreSQL:
Beachten Sie, dass die Zieltabelle in der
FROM
Klausel für Postgres nicht wiederholt werden darf .Orakel:
SQLite:
quelle
set assid = s.assid
sein sollteset u.assid = s.assid
.=
mehr als eine Zeile zurückgibt?update ud set assid = s.assid
Dies sollte in SQL Server funktionieren:
quelle
postgres
quelle
Ein Standard-SQL-Ansatz wäre
Unter SQL Server können Sie einen Join verwenden
quelle
WHERE
Klausel einfach weitere Bedingungen hinzufügen , wenn Sie mit zusätzlichen Spalten übereinstimmen möchten.PostgreSQL :
quelle
Vereinfachte Update Abfrage mit JOIN mehrere Tabellen -Ing.
Hinweis - first_table, second_table, Third_table und some_column wie 123456 sind Demo-Tabellennamen, Spaltennamen und IDs. Ersetzen Sie sie durch die gültigen Namen.
quelle
Ein weiteres Beispiel, warum SQL nicht wirklich portabel ist.
Für MySQL wäre es:
Weitere Informationen finden Sie unter Aktualisierung mehrerer Tabellen: http://dev.mysql.com/doc/refman/5.0/en/update.html
quelle
Teradata Aster bietet einen weiteren interessanten Weg, um das Ziel zu erreichen:
quelle
Ich dachte, der SQL-Server im oberen Beitrag würde für Sybase funktionieren, da beide T-SQL sind, aber leider nicht.
Für Sybase habe ich festgestellt, dass das Update in der Tabelle selbst und nicht im Alias enthalten sein muss:
quelle
Die folgende Anweisung mit dem Schlüsselwort FROM wird verwendet, um mehrere Zeilen mit einem Join zu aktualisieren
quelle
MySQL
Sie erzielen die beste Leistung, wenn Sie die where-Klausel vergessen und alle Bedingungen in den ON-Ausdruck einfügen.
Ich denke, das liegt daran, dass die Abfrage zuerst die Tabellen verknüpfen muss und dann die where-Klausel darauf ausführt. Wenn Sie also reduzieren können, was für die Verknüpfung erforderlich ist, ist dies der schnellste Weg, um die Ergebnisse zu erhalten / das udpate auszuführen.
Beispiel
Szenario
Sie haben eine Benutzertabelle. Sie können sich mit ihrem Benutzernamen, ihrer E-Mail-Adresse oder ihrer Kontonummer anmelden. Diese Konten können aktiv (1) oder inaktiv (0) sein. Diese Tabelle enthält 50000 Zeilen
Sie haben dann eine Tabelle mit Benutzern, die Sie auf einmal deaktivieren können, weil Sie herausfinden, dass sie alle etwas Schlechtes getan haben. Diese Tabelle enthält jedoch eine Spalte mit gemischten Benutzernamen, E-Mails und Kontonummern. Es hat auch einen "has_run" Indikator, der auf 1 (true) gesetzt werden muss, wenn es ausgeführt wurde
Abfrage
Argumentation
Wenn wir nur unter den OR-Bedingungen beitreten müssten, müsste im Wesentlichen jede Zeile viermal überprüft werden, um festzustellen, ob sie beitreten sollte, und möglicherweise viel mehr Zeilen zurückgeben. Wenn Sie jedoch mehr Bedingungen festlegen, können viele Zeilen "übersprungen" werden, wenn sie beim Verbinden nicht alle Bedingungen erfüllen.
Bonus
Es ist besser lesbar. Alle Bedingungen befinden sich an einem Ort und die zu aktualisierenden Zeilen befinden sich an einem Ort
quelle
Und in MS ACCESS:
quelle
Am einfachsten ist es, den in SQL 2005 eingeführten Common Table Expression (CTE) zu verwenden
quelle
quelle
Versuchen Sie dieses, ich denke, das wird für Sie funktionieren
quelle
Verwenden Sie für SQLite die RowID-Eigenschaft, um das Update durchzuführen:
quelle