Ich muss diese Tabelle in SQL Server 2005 mit Daten aus der übergeordneten Tabelle aktualisieren (siehe unten):
Verkauf
id (int)
udid (int)
assid (int)
d
id (int)
assid (int)
sale.assid
enthält den korrekten Wert zum Aktualisieren von ud.assid
.
Welche Abfrage wird dies tun? Ich denke an ein join
, aber ich bin nicht sicher, ob es möglich ist.
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. B. Wenn Ihr SQL-DBMS MERGE
nicht unterstützt):
ANSI/ISO:
update ud
set assid = (
select sale.assid
from sale
where sale.udid = ud.id
)
where exists (
select *
from sale
where sale.udid = ud.id
);
MySQL:
update ud u
inner join sale s on
u.id = s.udid
set u.assid = s.assid
SQL Server:
update u
set u.assid = s.assid
from ud u
inner join sale s on
u.id = s.udid
PostgreSQL:
update ud
set ud.assid = s.assid
from sale s
where ud.id = s.udid;
Beachten Sie, dass die Zieltabelle in der FROM
-Klausel für Postgres nicht wiederholt werden darf.
Orakel:
update
(select
u.assid as new_assid,
s.assid as old_assid
from ud u
inner join sale s on
u.id = s.udid) up
set up.new_assid = up.old_assid
SQLite:
update ud
set assid = (
select sale.assid
from sale
where sale.udid = ud.id
)
where RowID in (
select RowID
from ud
where sale.udid = ud.id
);
Dies sollte in SQL Server funktionieren:
update ud
set assid = sale.assid
from sale
where sale.udid = id
postgres
UPDATE table1
SET COLUMN = value
FROM table2,
table3
WHERE table1.column_id = table2.id
AND table1.column_id = table3.id
AND table1.COLUMN = value
AND table2.COLUMN = value
AND table3.COLUMN = value
Ein Standard-SQL-Ansatz wäre
UPDATE ud
SET assid = (SELECT assid FROM sale s WHERE ud.id=s.id)
Unter SQL Server können Sie einen Join verwenden
UPDATE ud
SET assid = s.assid
FROM ud u
JOIN sale s ON u.id=s.id
CREATE TABLE ud (id integer, assid integer);
CREATE TABLE sales (id integer, udid integer, assid integer);
UPDATE ud
SET assid = sales.assid
FROM sales
WHERE sales.id = ud.id;
Vereinfachte Aktualisierungsabfrage mit JOIN - mehreren Tabellen.
UPDATE
first_table ft
JOIN second_table st ON st.some_id = ft.some_id
JOIN third_table tt ON tt.some_id = st.some_id
.....
SET
ft.some_column = some_value
WHERE ft.some_column = 123456 AND st.some_column = 123456
Anmerkung - first_table, second_table, third_table und some_column wie 123456 sind Namen von Demo-Tabellen, Spalten und IDs. Ersetzen Sie sie durch die gültigen Namen.
Ein weiteres Beispiel, warum SQL nicht wirklich portabel ist.
Für MySQL wäre es:
update ud, sale
set ud.assid = sale.assid
where sale.udid = ud.id;
Weitere Informationen finden Sie unter Aktualisierung mehrerer Tabellen: http://dev.mysql.com/doc/refman/5.0/en/update.html
UPDATE [LOW_PRIORITY] [IGNORE] table_references
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
Teradata Aster bietet einen weiteren interessanten Weg, um das Ziel zu erreichen:
MERGE INTO ud --what trable should be updated
USING sale -- from what table/relation update info should be taken
ON ud.id = sale.udid --join condition
WHEN MATCHED THEN
UPDATE SET ud.assid = sale.assid; -- how to update
Ich dachte, der SQL-Server im oberen Post würde für Sybase funktionieren, da beide T-SQL sind, aber leider nicht.
Für Sybase habe ich festgestellt, dass das Update auf der Tabelle selbst und nicht auf dem Alias liegen muss:
update ud
set u.assid = s.assid
from ud u
inner join sale s on
u.id = s.udid
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 dazu ausführt. Wenn Sie also die für die Verknüpfung erforderlichen Elemente reduzieren können, ist dies der schnellste Weg, um die Ergebnisse zu ermitteln/die Aktualisierung durchzuführen.
Sie haben eine Benutzerliste. 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 Benutzerliste, 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 ein "has_run" -Indikator, der auf 1 (wahr) gesetzt werden muss, wenn es ausgeführt wurde
UPDATE users User
INNER JOIN
blacklist_users BlacklistUser
ON
(
User.username = BlacklistUser.account_ref
OR
User.email = BlacklistedUser.account_ref
OR
User.phone_number = BlacklistUser.account_ref
AND
User.is_active = 1
AND
BlacklistUser.has_run = 0
)
SET
User.is_active = 0,
BlacklistUser.has_run = 1;
Wenn wir nur unter den Bedingungen OR 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 es jedoch mehr Bedingungen gibt, kann es viele Zeilen "überspringen", wenn sie beim Beitritt nicht alle Bedingungen erfüllen.
Es ist besser lesbar. Alle Bedingungen befinden sich an einer Stelle, und die zu aktualisierenden Zeilen befinden sich an einer Stelle
Die folgende Anweisung mit dem Schlüsselwort FROM wird verwendet, um mehrere Zeilen mit einem Join zu aktualisieren
UPDATE users
set users.DivisionId=divisions.DivisionId
from divisions join users on divisions.Name=users.Division
Und in MS Access:
UPDATE ud
INNER JOIN sale ON ud.id = sale.udid
SET ud.assid = sale.assid;
UPDATE tblAppraisalBasicData
SET tblAppraisalBasicData.ISCbo=1
FROM tblAppraisalBasicData SI INNER JOIN aaa_test RAN ON SI.EmpID = RAN.ID
Verwenden Sie für SQLite die RowID-Eigenschaft, um das Update durchzuführen:
update Table set column = 'NewValue'
where RowID =
(select t1.RowID from Table t1
join Table2 t2 on t1.JoinField = t2.JoinField
where t2.SelectValue = 'FooMyBarPlease');
Am einfachsten ist die Verwendung von dem in SQL 2005 eingeführten Common Table Expression (CTE)
with cte as
(select u.assid col1 ,s.assid col2 from ud u inner join sale s on u.id = s.udid)
update cte set col1=col2
Versuchen Sie dieses, ich denke, dass dieses für Sie arbeitet
update ud
set ud.assid = sale.assid
from ud
Inner join sale on ud.id = sale.udid
where sale.udid is not null