Ho bisogno di aggiornare questa tabella in SQL Server 2005 con i dati dalla sua tabella 'genitore', vedi sotto:
vendita
id (int)
udid (int)
assid (int)
ud
id (int)
assid (int)
sale.assid
contiene il valore corretto per aggiornare ud.assid
.
Quale query lo farà? Sto pensando join
ma non sono sicuro che sia possibile.
La sintassi dipende strettamente da quale DBMS SQL stai usando. Ecco alcuni modi per farlo in ANSI/ISO (alias dovrebbe funzionare su qualsiasi DBMS SQL), MySQL, SQL Server e Oracle. Tieni presente che il mio metodo ANSI/ISO suggerito sarà in genere molto più lento rispetto agli altri due metodi, ma se utilizzi un DBMS SQL diverso da MySQL, SQL Server o Oracle, allora potrebbe essere l'unica via da percorrere (ad es. se il tuo DBMS SQL non supporta MERGE
):
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
Server SQL:
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;
Si noti che la tabella di destinazione non deve essere ripetuta nella clausola FROM
per Postgres.
Oracolo:
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
);
Questo dovrebbe funzionare in SQL Server:
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
Sarebbe un approccio SQL standard
UPDATE ud
SET assid = (SELECT assid FROM sale s WHERE ud.id=s.id)
Su SQL Server è possibile utilizzare un join
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;
Domanda di aggiornamento semplificata utilizzando JOIN - in più tabelle.
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
Note - first_table, second_table, third_table e some_column come 123456 sono nomi di tabelle demo, nomi di colonne e id. Sostituiscili con i nomi validi.
Un altro esempio per cui SQL non è veramente portatile.
Per MySQL sarebbe:
update ud, sale
set ud.assid = sale.assid
where sale.udid = ud.id;
Per maggiori informazioni leggi l'aggiornamento di più tabelle: 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 offre un altro modo interessante per raggiungere l'obiettivo:
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
Stavo pensando che quello di SQL Server nel post superiore funzionerebbe per Sybase poiché sono entrambi T-SQL, ma sfortunatamente no.
Per Sybase ho trovato che l'aggiornamento deve essere sul tavolo stesso e non l'alias:
update ud
set u.assid = s.assid
from ud u
inner join sale s on
u.id = s.udid
Otterrai le migliori prestazioni se dimentichi la clausola where e inserisci tutte le condizioni nell'espressione ON.
Penso che questo sia dovuto al fatto che la query prima deve unirsi alle tabelle e quindi eseguire la clausola where, quindi se è possibile ridurre ciò che è richiesto per unirsi, questo è il modo digiuno per ottenere i risultati/eseguire l'udpate.
Hai una tabella di utenti. Possono accedere utilizzando il loro nome utente o email o numero di conto. Questi account possono essere attivi (1) o inattivi (0). Questa tabella ha 50000 righe
Poi hai una tabella di utenti da disabilitare in un colpo solo perché scopri che hanno fatto qualcosa di male. Questa tabella tuttavia ha una colonna con nomi utente, e-mail e numeri di account misti. Ha anche un indicatore "has_run" che deve essere impostato su 1 (true) quando è stato eseguito
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;
Se dovessimo aderire solo alle condizioni OR, sarebbe essenzialmente necessario controllare ogni riga 4 volte per vedere se dovrebbe unirsi e potenzialmente restituire molte più righe. Tuttavia, dandogli più condizioni può "saltare" molte righe se non soddisfano tutte le condizioni quando si uniscono.
È più leggibile. Tutte le condizioni sono in un posto e le righe da aggiornare si trovano in un unico posto
La seguente istruzione con la parola chiave FROM viene utilizzata per aggiornare più righe con un join
UPDATE users
set users.DivisionId=divisions.DivisionId
from divisions join users on divisions.Name=users.Division
E 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
Per SQLite utilizzare la proprietà RowID per effettuare l'aggiornamento:
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');
Il modo più semplice è usare Common Table Expression (CTE) introdotto in SQL 2005
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
Prova questo, penso che funzionerà per te
update ud
set ud.assid = sale.assid
from ud
Inner join sale on ud.id = sale.udid
where sale.udid is not null