J'ai besoin de mettre à jour cette table dans SQL Server 2005 avec les données de sa table 'parent', voir ci-dessous:
vente
id (int)
udid (int)
assid (int)
d
id (int)
assid (int)
sale.assid
contient la valeur correcte pour mettre à jour ud.assid
.
Quelle requête fera cela? Je pense à un join
mais je ne suis pas sûr que ce soit possible.
La syntaxe dépend strictement du SGBD SQL que vous utilisez. Voici quelques façons de le faire dans ANSI/ISO (devrait fonctionner sur tout SGBD SQL), MySQL, SQL Server et Oracle. Sachez que ma méthode ANSI/ISO suggérée sera généralement beaucoup plus lente que les deux autres méthodes, mais si vous utilisez un SGBD SQL autre que MySQL, SQL Server ou Oracle, alors cela peut être la seule solution si votre SGBD SQL ne supporte pas 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
Serveur 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;
Notez que la table cible ne doit pas être répétée dans la clause FROM
pour Postgres.
Oracle:
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
);
Cela devrait fonctionner dans 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
Une approche SQL standard serait
UPDATE ud
SET assid = (SELECT assid FROM sale s WHERE ud.id=s.id)
Sur SQL Server, vous pouvez utiliser une jointure
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;
Requête de mise à jour simplifiée utilisant JOIN - plusieurs tables.
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 et some_column comme 123456 sont des noms de tables de démonstration, des noms de colonnes et des identifiants. Remplacez-les par les noms valides.
Un autre exemple pourquoi SQL n'est pas vraiment portable.
Pour MySQL, ce serait:
update ud, sale
set ud.assid = sale.assid
where sale.udid = ud.id;
Pour plus d'informations, lisez la mise à jour de plusieurs tables: http://dev.mysql.com/doc/refman/5.0/fr/update.html
UPDATE [LOW_PRIORITY] [IGNORE] table_references
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
Teradata Aster offre un autre moyen intéressant d'atteindre l'objectif:
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
Je pensais que celui de SQL Server figurant dans l'article le plus haut fonctionnerait pour Sybase, car ils sont tous les deux T-SQL mais malheureusement pas.
Pour Sybase, la mise à jour doit se trouver sur la table et non sur l'alias:
update ud
set u.assid = s.assid
from ud u
inner join sale s on
u.id = s.udid
Vous obtiendrez les meilleures performances si vous oubliez la clause where et placez toutes les conditions dans l'expression ON.
Je pense que c’est parce que la requête doit d’abord joindre les tables, puis la clause where est exécutée. Par conséquent, si vous pouvez réduire ce qui est requis pour la jointure, c’est le moyen le plus rapide d’obtenir les résultats/faire la mise au point.
Vous avez une table d'utilisateurs. Ils peuvent se connecter à l'aide de leur nom d'utilisateur ou de leur adresse électronique ou de leur numéro de compte. Ces comptes peuvent être actifs (1) ou inactifs (0). Cette table a 50000 lignes
Vous avez ensuite une table d'utilisateurs à désactiver en une fois, car vous découvrez qu'ils ont tous fait quelque chose de mal. Ce tableau contient toutefois une colonne avec des noms d'utilisateur, des adresses électroniques et des numéros de compte mélangés. Il comporte également un indicateur "has_run" qui doit être défini sur 1 (vrai) lorsqu'il a été exécuté.
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;
Si nous devions joindre uniquement les conditions OR, il faudrait essentiellement vérifier chaque ligne 4 fois pour voir si elle devait être jointe et éventuellement renvoyer beaucoup plus de lignes. Cependant, en lui donnant plus de conditions, il peut "sauter" beaucoup de lignes si elles ne remplissent pas toutes les conditions lors de l'adhésion.
C'est plus lisible. Toutes les conditions sont réunies au même endroit et les lignes à mettre à jour le sont au même endroit
L'instruction suivante avec le mot-clé FROM est utilisée pour mettre à jour plusieurs lignes avec une jointure.
UPDATE users
set users.DivisionId=divisions.DivisionId
from divisions join users on divisions.Name=users.Division
Et dans 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
Pour SQLite, utilisez la propriété RowID pour effectuer la mise à jour:
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');
Le moyen le plus simple consiste à utiliser l'expression de table commune (CTE) introduite dans 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
Essayez celui-ci, je pense que cela fonctionnera pour vous
update ud
set ud.assid = sale.assid
from ud
Inner join sale on ud.id = sale.udid
where sale.udid is not null