J'ai besoin de mettre à jour cette table dans SQL Server avec les données de sa table «parent», voir ci-dessous:
Tableau: vente
id (int)
udid (int)
assid (int)
Tableau: ud
id (int)
assid (int)
sale.assid
contient la valeur correcte à mettre à jour ud.assid
.
Quelle requête fera cela? Je pense à un join
mais je ne sais pas si c'est possible.
sql
sql-server
tsql
sql-server-2005
sql-update
Ant Swift
la source
la source
Réponses:
La syntaxe dépend strictement du SGBD SQL que vous utilisez. Voici quelques façons de le faire dans ANSI / ISO (aka devrait fonctionner sur n'importe quel SGBD SQL), MySQL, SQL Server et Oracle. Soyez avisé 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 c'est peut-être la seule voie à suivre (par exemple si votre SGBD SQL ne prend pas en charge
MERGE
):ANSI / ISO:
MySQL:
Serveur SQL:
PostgreSQL:
Notez que la table cible ne doit pas être répétée dans la
FROM
clause pour Postgres.Oracle:
SQLite:
la source
set assid = s.assid
devrait l'êtreset u.assid = s.assid
.=
retourne plus d'une ligne?update ud set assid = s.assid
Cela devrait fonctionner dans SQL Server:
la source
postgres
la source
Une approche SQL standard serait
Sur SQL Server, vous pouvez utiliser une jointure
la source
WHERE
clause si vous souhaitez faire correspondre des colonnes supplémentaires.PostgreSQL :
la source
Requête de mise à jour simplifiée utilisant JOIN -ing plusieurs tables.
Remarque - first_table, second_table, third_table et some_column comme 123456 sont des noms de table de démonstration, des noms de colonne et des identifiants. Remplacez-les par les noms valides.
la source
Un autre exemple pourquoi SQL n'est pas vraiment portable.
Pour MySQL, ce serait:
Pour plus d'informations, lisez la mise à jour de plusieurs tables: http://dev.mysql.com/doc/refman/5.0/en/update.html
la source
Teradata Aster offre une autre façon intéressante d'atteindre l'objectif:
la source
Je pensais que celui de SQL-Server dans le post supérieur fonctionnerait pour Sybase car ils sont tous les deux T-SQL mais malheureusement pas.
Pour Sybase, j'ai trouvé que la mise à jour doit être sur la table elle-même et non sur l'alias:
la source
L'instruction suivante avec le mot clé FROM est utilisée pour mettre à jour plusieurs lignes avec une jointure
la source
MySQL
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 rejoindre les tables, puis exécute la clause where à ce sujet, donc si vous pouvez réduire ce qui est nécessaire pour rejoindre, c'est la manière rapide d'obtenir les résultats / faire la mise à jour.
Exemple
Scénario
Vous avez une table d'utilisateurs. Ils peuvent se connecter en utilisant leur nom d'utilisateur ou leur adresse e-mail ou leur numéro de compte. Ces comptes peuvent être actifs (1) ou inactifs (0). Ce tableau comporte 50000 lignes
Vous avez ensuite un tableau d'utilisateurs à désactiver en une seule fois, car vous découvrez qu'ils ont tous fait quelque chose de mal. Ce tableau contient cependant une colonne avec des noms d'utilisateur, des e-mails et des numéros de compte mélangés. Il a également un indicateur "has_run" qui doit être mis à 1 (vrai) quand il a été exécuté
Requete
Raisonnement
Si nous devions nous joindre uniquement aux conditions OU, il faudrait essentiellement vérifier chaque ligne 4 fois pour voir si elle devait se joindre, et potentiellement 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 la jonction.
Prime
C'est plus lisible. Toutes les conditions sont au même endroit et les lignes à mettre à jour sont au même endroit
la source
Et dans MS ACCESS:
la source
Le moyen le plus simple consiste à utiliser l'expression de table commune (CTE) introduite dans SQL 2005
la source
la source
Essayez celui-ci, je pense que cela fonctionnera pour vous
la source
Pour SQLite, utilisez la propriété RowID pour effectuer la mise à jour:
la source