[SQL] Faire un update sur plusieurs critères provenant d'une table

Faire un update sur plusieurs critères provenant d'une table [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 17-08-2004 à 15:09:39    

Bonjour,
 
Je souhaiterais mettre à jour une table dont la valeur des critères seraient des lignes d'une autre table.
 
Exemple :
---------
 
Voici ce que j'ai maintenant :
 

Code :
  1. UPDATE maTable
  2. SET monChamp1 = "valeur"
  3. WHERE (((monChamp2) Like 'dupon*' Or (monChamp2) Like 'duran*'));


 
En gros, je voudrais arriver à ça :
 

Code :
  1. UPDATE maTable
  2. SET monChamp1 = "valeur"
  3. WHERE (monChamp2 Like (SELECT condition FROM maTable2) & "*" );


 
(bien entendu, dans maTable2, j'aurais les enregistrements dupon, duran et plein d'autres.
 
Le but est de ne pas avoir 50 conditions dans ma requête, mais de modifier/ajouter des lignes dans une table, qui ne serviraient qu'à faire les conditions de ma requête...
 
(Bon, je sais, c'est pas très clair  :( )
 
Merci
 
NB : SGBD = Access

Reply

Marsh Posté le 17-08-2004 à 15:09:39   

Reply

Marsh Posté le 17-08-2004 à 16:43:28    

utilise
 
WHERE mon_champ IN (SELECT patati patata FROM Matable2)

Reply

Marsh Posté le 17-08-2004 à 16:58:16    

ca marche pas avec tout ca. D ailleurs je me demande si MySQL le fait !

Reply

Marsh Posté le 17-08-2004 à 17:14:28    

Avec, Access, pour faire un LIKE, cette requête doit marcher (c'est du moins la requête SQL Server si mes souvenirs sont bons) :
 
UPDATE maTable1
SET monChamp1 = 'valeur'
FROM maTable2
WHERE conditions_maTable2
AND maTable1.monChamp2 like maTable2 || '%'


Message édité par Arjuna le 17-08-2004 à 17:15:13
Reply

Marsh Posté le 17-08-2004 à 18:03:08    

Citation :

utilise  
 
WHERE mon_champ IN (SELECT patati patata FROM Matable2)


 
Euh, oui mais je perd le "*" de mon "like" il me semble...
Moi je veux qu'il me mette à jour les "dupon, dupond, dupont, duponchelle, dupontel, etc..." si je mets "dupon" dans ma 2ème table !
 
 

Arjuna a écrit :

Avec, Access, pour faire un LIKE, cette requête doit marcher (c'est du moins la requête SQL Server si mes souvenirs sont bons) :
 
UPDATE maTable1
SET monChamp1 = 'valeur'
FROM maTable2
WHERE conditions_maTable2
AND maTable1.monChamp2 like maTable2 || '%'


 
Ben je serais tenté de dire "Bouhouhou ça marche pas !"  :lol:  
 
Il me retourne l'erreur suivante :
Erreur de syntaxe (opérateur absent) dans l'expression '"valeur" FROM maTable2'.
 
Je comprends pas la requête... Comment je peux faire un update matable1 from matable2 avec une condition monchamp2 like matable2 ???  :heink:

Reply

Marsh Posté le 18-08-2004 à 14:32:05    

Parceque c'est la syntaxe SQL Server 2000, et qu'Access 2003 du moins utilise aussi.

Reply

Marsh Posté le 18-08-2004 à 14:33:14    


 
 Référence de Transact-SQL  
 
 
UPDATE
Modifie les données existantes d'une table.
 
Syntaxe
UPDATE
        {  
         table_name WITH ( < table_hint_limited > [ ...n ] )  
         | view_name  
         | rowset_function_limited  
        }  
        SET  
        { column_name = { expression | DEFAULT | NULL }  
        | @variable = expression  
        | @variable = column = expression } [ ,...n ]  
 
    { { [ FROM { < table_source > } [ ,...n ] ]  
 
        [ WHERE  
            < search_condition > ] }  
        |  
        [ WHERE CURRENT OF  
        { { [ GLOBAL ] cursor_name } | cursor_variable_name }  
        ] }  
        [ OPTION ( < query_hint > [ ,...n ] ) ]  
 
< table_source > ::=  
    table_name [ [ AS ] table_alias ] [ WITH ( < table_hint > [ ,...n ] ) ]  
    | view_name [ [ AS ] table_alias ]  
    | rowset_function [ [ AS ] table_alias ]  
    | derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]  
    | < joined_table >  
 
< joined_table > ::=  
    < table_source > < join_type > < table_source > ON < search_condition >  
    | < table_source > CROSS JOIN < table_source >  
    | < joined_table >  
 
< join_type > ::=  
    [ INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } ]  
    [ < join_hint > ]  
    JOIN  
 
< table_hint_limited > ::=  
    {    FASTFIRSTROW  
        | HOLDLOCK  
        | PAGLOCK  
        | READCOMMITTED  
        | REPEATABLEREAD  
        | ROWLOCK  
        | SERIALIZABLE  
        | TABLOCK  
        | TABLOCKX  
        | UPDLOCK  
    }  
 
< table_hint > ::=  
    {    INDEX ( index_val [ ,...n ] )  
        | FASTFIRSTROW  
        | HOLDLOCK  
        | NOLOCK  
        | PAGLOCK  
        | READCOMMITTED  
        | READPAST  
        | READUNCOMMITTED  
        | REPEATABLEREAD  
        | ROWLOCK  
        | SERIALIZABLE  
        | TABLOCK  
        | TABLOCKX  
        | UPDLOCK  
    }  
 
< query_hint > ::=  
    {    { HASH | ORDER } GROUP  
        | { CONCAT | HASH | MERGE } UNION  
        | {LOOP | MERGE | HASH } JOIN  
        | FAST number_rows  
        | FORCE ORDER  
        | MAXDOP  
        | ROBUST PLAN  
        | KEEP PLAN  
    }  
 
Arguments
table_name
 
Indique le nom de la table à mettre à jour. Si la table ne figure pas dans le serveur ou la base de données en cours, ou s'il n'appartient pas à l'utilisateur actuel, ce nom peut être qualifié avec le nom du serveur lié, de la base de données et du propriétaire.  
 
WITH ( < table_hint_limited > [ ...n ] )  
 
Une ou plusieurs options de table autorisées pour une table cible. Le mot clé WITH et les parenthèses sont obligatoires. READPAST, NOLOCK et READUNCOMMITTED ne sont pas autorisés. Pour plus d'informations sur les indicateurs de table, voir FROM.
 
view_name
 
Indique le nom de la vue à mettre à jour. La vue dont la référence est view_name doit pouvoir être mise à jour. Les modifications effectuées par l'instruction UPDATE ne peuvent pas affecter plus d'une table de base référencée dans la clause FROM de la vue. Pour plus d'informations sur les vues pouvant être mises à jour, voir CREATE VIEW.
 
rowset_function_limited
 
Fonctions OPENQUERY ou OPENROWSET, en fonction des possibilités du fournisseur. Pour plus d'informations sur les fonctionnalités dont a besoin le fournisseur, voir Conditions associées aux instructions UPDATE et DELETE pour les fournisseurs OLE DB. Pour plus d'informations, voir OPENQUERY et OPENROWSET.
 
SET
 
Liste des noms des colonnes ou des variables à mettre à jour.
 
column_name
 
Colonne contenant les données à modifier. column_name doit appartenir à la table ou à la vue spécifiée dans la clause UPDATE. Il est impossible de mettre à jour les colonnes d'identité.  
 
Lorsqu'un nom de colonne qualifié est spécifié, le qualificateur doit correspondre au nom de la table ou de la vue de la clause UPDATE. Par exemple, l'exemple suivant est valide :
 
UPDATE authors
    SET authors.au_fname = 'Annie'
    WHERE au_fname = 'Anne'
 
Un alias de table spécifié dans une clause FROM ne peut pas être utilisé en tant que qualificateur dans SET column_name. Par exemple, l'exemple suivant n'est pas valide :
 
UPDATE titles
    SET t.ytd_sales = t.ytd_sales + s.qty
    FROM titles t, sales s
    WHERE t.title_id = s.title_id
    AND s.ord_date = (SELECT MAX(sales.ord_date) FROM sales)
 
Pour faire en sorte que l'exemple fonctionne, supprimez l'alias t. du nom de la colonne.
 
UPDATE titles
    SET ytd_sales = t.ytd_sales + s.qty
    FROM titles t, sales s
    WHERE t.title_id = s.title_id
    AND s.ord_date = (SELECT MAX(sales.ord_date) FROM sales)
 
expression
 
Variable, valeur littérale, expression ou sous-instruction SELECT entre parenthèses retournant une valeur unique. La valeur renvoyée par expression remplace la valeur existante de column_name ou de @variable.
 
DEFAULT
 
Indique que la valeur par défaut définie pour la colonne doit remplacer la valeur actuelle de la colonne. Peut également être utilisé pour attribuer la valeur NULL à la colonne si celle-ci n'a pas de valeur par défaut et autorise les valeurs NULL.
 
@variable
 
Variable déclarée définie à la valeur retournée par expression.  
 
SET @variable = column = expression définit la variable comme une valeur identique à celle de la colonne. Ceci est différent de SET @variable = column, column = expression, qui définit la variable à la valeur de la colonne avant la mise à jour.
 
FROM < table_source >  
 
Indique qu'une table est utilisée pour fournir les valeurs destinées à servir de critères en vue de l'opération de mise à jour. Pour plus d'informations, voir FROM.  
 
table_name [ [AS] table_alias ]  
Nom de la table fournissant les critères destinés à l'opération de mise à jour.  
Si la table mise à jour est la même que la table de la clause FROM, et s'il n'existe qu'une seule référence à cette table de la clause FROM, table_alias pourra être spécifié ou non. Si la table mise à jour apparaît plusieurs fois dans la clause FROM, l'une des références (mais une seule) à cette table ne doit pas spécifier un alias de la table. Toutes les autres références à la table dans la clause FROM doivent inclure un alias de table.  
 
 
view_name [ [ AS ] table_alias ]  
Nom de la vue fournissant les critères destinés à l'opération de mise à jour. Une vue avec un déclencheur INSTEAD OF UPDATE ne peut pas servir de cible à une instruction UPDATE avec une clause FROM.
 
WITH ( < table_hint > [ ...n ] )  
Une ou plusieurs options de table autorisées pour une table source. Pour plus d'informations sur les options de table, voir « FROM » dans ce volume.
 
rowset_function [ [AS] table_alias ]  
Nom d'une fonction d'ensemble de lignes et d'un alias facultatif. Pour obtenir la liste des fonctions d'ensemble de lignes, voir Fonctions d'ensembles de lignes.
 
derived_table  
Sous-requête qui récupère les lignes de la base de données. derived_table est utilisé comme entrée pour le résultat de la requête.
 
column_alias  
Alias facultatif qui peut remplacer un nom de colonne dans le jeu de résultats. Utilisez un alias de colonne pour chaque colonne de la liste de sélection et placez l'intégralité de la liste d'alias entre parenthèses.  
< joined_table >
 
Jeu de résultats qui correspond au produit de deux ou plusieurs tables, comme par exemple :
 
SELECT *
FROM tab1 LEFT OUTER JOIN tab2 ON tab1.c3 = tab2.c3
    RIGHT OUTER JOIN tab3 LEFT OUTER JOIN tab4
        ON tab3.c1 = tab4.c1
        ON tab2.c3 = tab4.c3
 
Pour plusieurs jointures CROSS, vous devez utiliser les parenthèses pour modifier l'ordre naturel des jointures.
 
< join_type >
 
Type d'opération de jointure.  
 
INNER  
Indique que tous les couples de lignes correspondants sont renvoyés. Supprime les lignes n'ayant pas de correspondance entre les deux tables. Ceci est l'option par défaut si aucun type de jointure n'est spécifié.
 
LEFT [OUTER]  
Indique que toutes les lignes de la table de gauche ne réunissant pas les critères spécifiés sont comprises dans le jeu de résultats en plus de l'ensemble des lignes renvoyées par la jointure interne. Les colonnes de sortie de la table de gauche prennent la valeur NULL.
 
RIGHT [OUTER]  
Indique que toutes les lignes de la table de droite ne réunissant pas les critères spécifiés sont comprises dans le jeu de résultats en plus de l'ensemble des lignes renvoyées par la jointure interne. Les colonnes de sortie de la table de droite prennent la valeur NULL.
 
FULL [OUTER]  
Si une ligne d'une des deux tables ne répond pas aux critères de sélection, cette option spécifie la ligne à inclure dans le jeu de résultats et les colonnes de sortie qui correspondent à l'autre table doivent prendre la valeur NULL. Ceci en plus de toutes les lignes généralement renvoyées par la jointure interne.
 
< join_hint >  
Option de jointure ou algorithme d'exécution. Si <join_hint> est spécifié, INNER, LEFT, RIGHT ou FULL doivent également être spécifiés de manière explicite. Pour plus d'informations sur les indicateurs de jointure, voir FROM.
 
JOIN  
Indique que les tables ou vues spécifiées doivent être jointes.  
ON < search_condition >
 
Indique la condition sur laquelle se base la jointure. Celle-ci peut spécifier tout prédicat, bien que les opérateurs de colonne et de comparaison soient souvent utilisés, comme par exemple :
 
FROM Suppliers JOIN Products  
    ON (Suppliers.SupplierID = Products.SupplierID)
 
Lorsqu'une condition spécifie des colonnes, celles-ci ne doivent pas nécessairement avoir le même nom ou le même type de données ; cependant, si les types de données sont différents, ils doivent être compatibles ou pouvoir être convertis de manière implicite par Microsoft® SQL™ Server. Si les types de données ne peuvent pas être convertis implicitement, la condition de jointure doit le faire explicitement à l'aide de la fonction CAST.  
 
Pour plus d'informations sur les conditions de recherche et les prédicats, voir Search Condition.
 
CROSS JOIN
 
Spécifie le produit croisé de deux tables. Renvoie les mêmes lignes comme si les tables à joindre étaient simplement énumérées dans la clause FROM et qu'aucune clause WHERE n'était spécifiée.
 
WHERE
 
Conditions de limite des lignes mises à jour. Il existe deux formes de mise à jour en fonction du contenu de la clause WHERE :  
 
Les mises à jour avec recherche comportent une condition de recherche pour qualifier les lignes à supprimer.
 
 
Les mise à jour avec positions utilisent la clause CURRENT OF pour définir un curseur. La mise à jour se produit à l'emplacement actuel du curseur.  
< search_condition >
 
Condition à remplir pour mettre à jour les lignes. La condition de recherche peut également être la condition sur laquelle est basée une jointure. Le nombre de prédicats inclus dans une condition de recherche est illimité. Pour plus d'informations sur les conditions de recherche et les prédicats, voir Search Condition.
 
CURRENT OF
 
Indique que la mise à jour s'effectue à l'emplacement actuel du curseur spécifié.
 
GLOBAL
 
Précise que cursor_name renvoie à un curseur global.
 
cursor_name
 
Nom du curseur ouvert grâce auquel s'effectue l'extraction. S'il existe deux curseurs portant le nom cursor_name, l'un global et l'autre local, cursor_name renvoie au curseur global si GLOBAL est précisé. Si GLOBAL n'est pas spécifié, cursor_name renvoie au curseur local. Le curseur doit pouvoir gérer les mises à jour.
 
cursor_variable_name
 
Nom d'une variable de curseur. cursor_variable_name doit faire référence à un curseur autorisant les mises à jour.
 
OPTION ( < query_hint > [ ,...n ] )
 
Options d'optimisation servant à personnaliser le traitement de l'instruction par SQL Server.  
 
{ HASH | ORDER } GROUP  
Spécifie que les agrégations utilisées dans les clauses GROUP BY ou COMPUTE de la requête doivent utiliser le hachage ou le classement.
 
{LOOP | MERGE | HASH |} JOIN  
Précise que toutes les opérations de jointure sont effectuées par LOOP JOIN, MERGE JOIN ou HASH JOIN dans la requête entière. Si plus d'une option de jointure est spécifiée, l'optimiseur sélectionne la stratégie la moins coûteuse parmi les options spécifiées. Si, dans la même requête, une option de jointure est également spécifiée pour une paire précise de tables, il a la priorité sur la jointure des deux tables.
 
{MERGE | HASH | CONCAT} UNION  
Spécifie que toutes les opérations UNION doivent être effectuées par la fusion, le hachage ou la concaténation d'ensembles UNION. Si plus d'une option UNION est spécifiée, l'optimiseur sélectionne la stratégie la moins coûteuse parmi les options spécifiées.  
 
 
Remarque  Si une option de jointure est également spécifiée pour une paire de tables jointes dans la clause FROM, elle est prioritaire sur l'option de jointure spécifiée dans la clause OPTION.
 
 
 
FAST number_rows  
Spécifie que la requête est optimisée pour une extraction rapide du premier number_rows (un entier non négatif). Une fois le premier number_rows renvoyé, la requête se poursuit afin de générer un jeu de résultats complet.
 
FORCE ORDER  
Spécifie que l'ordre des jointures indiqué dans la syntaxe de la requête doit être conservé lors de l'optimisation de la requête.
 
MAXDOP number  
Ne modifie que l'option de configuration max degree of parallelism (de sp_configure) de la requête le demandant. Toutes les règles sémantiques utilisées avec l'option de configuration max degree of parallelism sont applicables lorsque vous utilisez l'option de requête MAXDOP. Pour plus d'informations, voir Option max degree of parallelism.
 
ROBUST PLAN  
Force l'optimiseur de requêtes à utiliser un plan capable de prendre en charge la taille maximale potentielle des lignes, aux dépens des performances. Si ce n'est pas possible, l'optimiseur de requêtes renvoie une erreur plutôt que de laisser l'erreur survenir pendant l'exécution de la requête. Les lignes peuvent contenir des colonnes de longueur variable, et SQL Server permet de définir des lignes d'une taille maximale potentielle qu'il n'est pas en mesure de traiter. En général, malgré la taille maximale potentielle, une application stocke des lignes dont la taille réelle est comprise dans les limites gérées par SQL Server. Si SQL Server trouve une ligne trop longue, il renvoie une erreur d'exécution.  
KEEP PLAN
 
Force l'optimiseur de requêtes à détendre le seuil de recompilation estimé pour une requête. Le seuil de recompilation estimé correspond au point auquel la requête est automatiquement recompilée lorsque le nombre estimé de modifications de colonnes indexées (update, delete ou insert) a été effectué sur une table. La spécification de KEEP PLAN fait en sorte qu'une requête est recompilée moins fréquemment lorsqu'il y a plusieurs mises à jour effectuées sur une table.
 
Notes
Vous pouvez insérer des instructions UPDATE dans le corps des fonctions définies par l'utilisateur uniquement si la table en cours de modification est une variable table.
 
Dans sa portée, la variable table est accessible de la même façon qu'une table normale. Dès lors, elle peut s'employer comme la table dont les données sont mises à jour par une instruction UPDATE.
 
Un nom en quatre parties créé au moyen de la fonction OPENDATASOURCE comme la partie nom de serveur peut être utilisé comme source de la table, et ce à tous les endroits où peut apparaître un nom de table dans une instruction UPDATE.
 
Si la mise à jour d'une ligne viole une contrainte ou une règle, par exemple la valeur NULL de la colonne, ou si la nouvelle valeur est d'un type de données incompatible, l'instruction est annulée, une erreur est renvoyée et aucun enregistrement n'est mis à jour.
 
Lorsqu'une instruction UPDATE rencontre une erreur arithmétique (erreur de dépassement de capacité, de division par zéro ou de domaine) lors de l'évaluation de l'expression, la mise à jour n'est pas effectuée. Le reste du lot d'instructions n'est pas exécuté et un message d'erreur est renvoyé.
 
Si la mise à jour d'une ou de plusieurs colonnes participant à un index ordonné en clusters conduit à une taille d'index et de ligne supérieure à 8060 octets, la mise à jour n'est pas effectuée et un message d'erreur est renvoyé.
 
Lorsqu'un déclencheur INSTEAD-OF est défini sur des actions UPDATE appliquées à une table, il est exécuté au lieu de l'instruction UPDATE. Les versions antérieures de SQL Server prennent uniquement en charge les déclencheurs AFTER définis sur UPDATE et autres instructions de modification de données.
 
Si une requête de mise à jour peut modifier plusieurs lignes tout en mettant à jour et la clé ordonnée en clusters et une ou plusieurs colonnes text, image ou Unicode, la mise à jour n'est pas effectuée et SQL Server renvoie un message d'erreur.
 
Modifier une colonne text, ntext ou image avec une instruction UPDATE initialise la colonne, lui affecte un pointeur de texte valide et lui alloue au moins une page de données, sauf si la colonne est mise à jour avec des valeurs NULL.
 
 
 
Remarque  L'instruction UPDATE est consignée dans le journal. Si vous remplacez ou modifiez de grands blocs de données de type text, ntext ou image, employez plutôt les instructions WRITETEXT ou UPDATETEXT au lieu de UPDATE. Par défaut, les instructions WRITETEXT et UPDATETEXT ne sont pas consignées dans le journal.  
 
 
Toutes les colonnes char et nchar sont complétées par des espaces à droite jusqu'à la longueur définie.
 
La définition de l'option SET ROWCOUNT est ignorée pour les instructions UPDATE en ce qui concerne les tables distantes et les vues partitionnées locales et distantes.
 
Si l'option ANSI_PADDING est désactivée (OFF), tous les espaces à droite sont supprimés des données insérées dans les colonnes varchar et nvarchar, sauf dans les chaînes ne contenant que des espaces. Ces chaînes sont tronquées en une chaîne vide. Si l'option ANSI_PADDING est activée (ON), des espaces supplémentaires sont insérés. Au moment de la connexion, le pilote ODBC de Microsoft SQL Server et le fournisseur OLE DB pour SQL Server attribuent automatiquement la valeur ON à SET ANSI_PADDING. Ceci peut être configuré dans les sources de données ODBC ou lors de la définition des attributs ou des propriétés des connexions.
 
Une mise à jour avec position utilisant une clause WHERE CURRENT OF met à jour la ligne sur laquelle est positionné le curseur. Cette opération peut s'avérer plus précise qu'une mise à jour avec recherche utilisant une clause WHERE <search_condition> pour qualifier les lignes à mettre à jour. Une mise à jour avec recherche modifie plusieurs lignes dès lors que la condition de recherche n'identifie pas de manière unique une seule ligne.
 
Les résultats d'une instruction UPDATE ne sont pas définis si celle-ci comprend une clause FROM qui ne spécifie pas qu'une seule valeur doit être disponible pour chaque occurrence de colonne mise à jour (à savoir, si l'instruction UPDATE n'est pas déterminante). Par exemple, étant donné l'instruction UPDATE dans le script suivant, les deux lignes dans la table s correspondent aux qualifications de la clause FROM dans l'instruction UPDATE, mais il n'y a aucune précision quant à savoir quelle ligne de la table s est utilisée pour mettre à jour la ligne de la table t.
 
CREATE TABLE s (ColA INT, ColB DECIMAL(10,3))
GO
CREATE TABLE t (ColA INT PRIMARY KEY, ColB DECIMAL(10,3))
GO
INSERT INTO s VALUES(1, 10.0)
INSERT INTO s VALUES(1, 20.0)
INSERT INTO t VALUES(1, 0.0)
GO
UPDATE t  
SET t.ColB = t.ColB + s.ColB
FROM t INNER JOIN s ON (t.ColA = s.ColA)
GO
 
Le même problème peut avoir lieu lors de la combinaison des deux clauses FROM et WHERE CURRENT OF. Dans cet exemple, les deux lignes de la table t2 correspondent aux qualifications de la clause FROM de l'instruction UPDATE. Aucune précision n'est fournie quant à savoir quelle ligne de la table t2 est utilisée pour mettre à jour la ligne de la table t1.
 
CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT)
GO
CREATE TABLE t2(d1 INT PRIMARY KEY, d2 INT)
GO
INSERT INTO t1 VALUES (1, 10)
INSERT INTO t2 VALUES (1, 20)
INSERT INTO t2 VALUES (2, 30)
go
 
DECLARE abc CURSOR LOCAL FOR
SELECT * FROM t1
 
OPEN abc
 
FETCH abc
 
UPDATE t1 SET c2 = c2 + d2  
FROM t2  
WHERE CURRENT OF abc
GO
 
Définition de variables et de colonnes
Des noms de variables peuvent être utilisés avec les instructions UPDATE pour présenter les anciennes et les nouvelles valeurs affectées. Ceci n'est applicable que si l'instruction UPDATE n'affecte qu'un seul enregistrement car, si l'instruction UPDATE affecte plusieurs enregistrements, les variables ne contiennent que les valeurs d'une des lignes mises à jour.
 
Autorisations
Les autorisations UPDATE reviennent par défaut aux membres du rôle de serveur fixe sysadmin et aux rôles de base de données fixe db_owner et db_datawriter. Les membres des rôles sysadmin, db_owner et db_securityadmin, ainsi que le propriétaire de la table, peuvent transmettre ces autorisations à d'autres utilisateurs.  
 
Les autorisations SELECT sont également requises pour la table en cours de mise à jour si l'instruction UPDATE contient une clause WHERE ou si expression de la clause SET utilise une colonne de la table.
 
Exemple
A. Utilisation d'une instruction UPDATE simple
Ces exemples illustrent la manière d'affecter toutes les lignes si une clause WHERE est éliminée d'une instruction UPDATE.
 
Dans cet exemple, si toutes les maisons d'édition de la table publishers transfèrent leur siège à Atlanta en Géorgie, voici la manière de mettre à jour la table publishers :
 
UPDATE publishers
SET city = 'Atlanta', state = 'GA'
 
Cet exemple remplace les noms de tous les éditeurs (publishers) par NULL :
 
UPDATE publishers
SET pub_name = NULL
 
Vous pouvez également utiliser dans une mise à jour des valeurs de colonnes calculées. Cet exemple double tous les prix de la table titles :
 
UPDATE titles
SET price = price * 2
 
B. Utilisation d'une instruction UPDATE avec une clause WHERE
La clause WHERE indique les lignes à mettre à jour. Par exemple si, par le plus grand des hasards, le nord de la Californie était renommé Pacifica (abrégé en PC) et si les habitants d'Oakland votaient pour changer le nom de leur ville en Bay City. Cet exemple illustre comment adapter la table authors (auteurs) pour tous les anciens habitants d'Oakland dont les adresses seraient désormais périmées.
 
UPDATE authors
   SET state = 'PC', city = 'Bay City'
      WHERE state = 'CA' AND city = 'Oakland'
 
Vous devez écrire une autre instruction pour modifier le nom de l'état pour les habitants d'autres villes du nord de la Californie.
 
C. Utilisation de l'instruction UPDATE avec des informations provenant d'une autre table
Cet exemple modifie la colonne ytd_sales dans la table titles (titres) pour refléter les dernières ventes enregistrées dans la table sales (ventes).  
 
UPDATE titles
   SET ytd_sales = titles.ytd_sales + sales.qty
      FROM titles, sales
         WHERE titles.title_id = sales.title_id
         AND sales.ord_date = (SELECT MAX(sales.ord_date) FROM sales)
 
Cet exemple suppose qu'un seul ensemble de ventes est enregistré pour un titre donné à une date donnée et que les mises à jour sont en cours. Dans le cas contraire (s'il est possible d'enregistrer plusieurs ventes d'un titre donné le même jour), l'exemple présenté ici ne fonctionnera pas correctement. Il s'exécutera sans erreur, mais chaque titre ne sera mis à jour qu'avec une seule vente, en dépit du nombre de ventes ayant réellement eu lieu ce jour. En effet, une instruction UPDATE ne met jamais une même ligne à jour à deux reprises.
 
Au cas où plusieurs ventes peuvent avoir lieu le même jour pour un titre donné, toutes les ventes de chaque titre doivent être additionnées dans l'instruction UPDATE, comme le montre l'exemple suivant :
 
UPDATE titles
   SET ytd_sales =  
      (SELECT SUM(qty)
         FROM sales
            WHERE sales.title_id = titles.title_id
            AND sales.ord_date IN (SELECT MAX(ord_date) FROM sales))
   FROM titles, sales
 
D. Utilisation de l'instruction UPDATE avec la clause TOP dans une instruction SELECT
Cette exemple met à jour la colonne state pour les 10 premiers auteurs de la table authors.
 
UPDATE authors
SET state = 'ZZ'  
FROM (SELECT TOP 10 * FROM authors ORDER BY au_lname) AS t1
WHERE authors.au_id = t1.au_id
 
 
Voir aussi
 
CREATE INDEX
 
CREATE TABLE  
 
CREATE TRIGGER  
 
Curseurs
 
DELETE
 
INSERT
 
SET ROWCOUNT
 
Fonctions texte et image
 
©1988-2000 Microsoft Corporation. Tous droits réservés.

Reply

Marsh Posté le 18-08-2004 à 16:13:09    

Oulala, ça va me faire de la lecture pour mes vieux jours...  :p  
 
Oui, j'ai oublié de préciser, mais c'est du Access 2000, donc je ne suis pas sûr que ça soit compatible.
 
Bon, je lis tout ça, et si je survis, je vous dis quoi...  :)  
 
Merci !  :jap:

Reply

Marsh Posté le 18-08-2004 à 17:17:27    

Je ne suis pas certain, mais je pense qu'Access 2000 supporte cette syntaxe aussi.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed