IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Update Set Select From


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2010
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 42
    Points : 27
    Points
    27
    Par défaut Update Set Select From
    Bonjour,

    Je veux mettre à jour les champs de mon entrepot de données en utilisant la requête suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    update dim_address
    set
    document_id = Ea.document_id,
    document_model = Ea.document_model,
    document_label = Ea.document_label,
    firstname = Ea.firstname,
    lastname = Ea.lastname,
    email = Ea.email,
    company = Ea.company,
    addressline1 = Ea.addressline1,
    addressline2 = Ea.addressline2,
    addressline3 = Ea.addressline3 ,
    zipcode = Ea.zipcode,
    city = Ea.city ,
    province = Ea.province ,
    countryid = Ea.countryid ,
    phone = Ea.phone ,
    mobilephone = Ea.mobilephone ,
    document_modificationdate = getDate()
    from 
    ( select
    document_id ,
    document_model ,
    document_label ,
    firstname ,
    lastname ,
    email ,
    company , 
    addressline1 ,
    addressline2 ,
    addressline3 ,
    zipcode ,
    city ,
    province ,
    countryid ,
    phone ,
    mobilephone ,
    document_creationdate ,
    document_modificationdate 
    from m_customer_doc_address 
    WHERE NOT EXISTS (
    select 
    document_id , 
    document_model , 
    document_label, 
    firstname , 
    lastname, 
    email, 
    company , 
    addressline1, 
    addressline2 , 
    addressline3, 
    zipcode , 
    city , 
    province , 
    countryid , 
    phone , 
    mobilephone, 
    document_creationdate, 
    document_modificationdate 
     from dim_address)) as Ea, dim_address as a
    where a.document_id = Ea.document_id.
    Elle me mets l' erreur suivante au niveau du from ( select : ERROR 1064 <42000> At line 1 : Erreur de syntaxe près de from ( select.

    SVP je voudrais savoir si ça ne s’écrit pas en SQL . Pouvez vous me donner une solution?

    Merci de votre compréhension.

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Quel est ton SGBD ?

    Tu peux faire soit ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE une_table
    SET une_colonne = une_valeur
    WHERE condition
    soit cela (mais je crois pas sur tous les SGBD) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE une_table t1
    INNER JOIN table2 t2 ON condition_de_jointure
    SET t1.une_colonne = t2.une_colonne
    WHERE condition
    EDIT :
    Je viens d'examiner ta requête...
    Dans la sous-requête qui figure dans le NOT EXISTS, inutile de préciser les colonnes dans le SELECT, c'est le seul cas ou SELECT * est justifié !
    En plus, comme tu n'as pas mis de condition dans cette sous requête, le NOT EXISTS sera toujours faux puisqu'il existe des lignes dans la table dim_address.

    Depuis 1992, les jointures s'écrivent avec l'opérateur JOIN ; il serait temps de s'y mettre !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2010
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 42
    Points : 27
    Points
    27
    Par défaut
    J'utilise le SGBD MySQL.

    Je vais essayé ta proposition pour voir si ça marche.

    Merci de ta piste

  4. #4
    Nouveau membre du Club
    Inscrit en
    Avril 2010
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 42
    Points : 27
    Points
    27
    Par défaut
    STP CinePhil, peux tu un peu mieux m'expliquer comment fonctionne le inner join.

    En effet, dans mon cas, à ce que j'ai compris, voici la requête que j'écris et ça ne marche toujours pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    update dim_address a
     
    INNER JOIN production.m_customer_doc_address m ON 
    (a.document_id = m.document_id ,
    a.document_model = m.document_model ,
    a.document_label = m.document_label,
    a.firstname = m.firstname , 
    a.lastname = m.lastname, 
    a.email = m.email, 
    a.company = m.company ,
    a.addressline1 = m.addressline1, 
    a.addressline2 = m.addressline2 ,
    a.addressline3 = m.addressline3, 
    a.zipcode = m.zipcode , 
    a.city = m.city , 
    a.province = m.province ,
    a.countryid = m.countryid , 
    a.phone = m.phone , 
    a.mobilephone = m.mobilephone,
    a.document_creationdate = m.document_creationdate, 
    a.document_modificationdate = m.document_modificationdate )
     
    set
    document_id = document_id,
    document_model = document_model,
    document_label = document_label,
    firstname = firstname,
    lastname = lastname,
    email = email,
    company = company,
    addressline1 = addressline1,
    addressline2 = addressline2,
    addressline3 = addressline3 ,
    zipcode = zipcode,
    city = city ,
    province = province ,
    countryid = countryid ,
    phone = phone ,
    mobilephone = mobilephone ,
    document_modificationdate = getDate()
     
    where a.document_id = Ea.document_id
    Peux tu encore plus m'expliquer? Merci de ta compréhension.

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Tu peux donner la structure des tables dim_address et m_customer_doc_address ?
    S'il y a vraiment les mêmes colonnes dans les deux tables, ta BDD est mal modélisée.

    Dans ta dernière requête, le WHERE est inutile ; d'ailleurs, l'alias ea n'existe pas dans la requête.

    Dans la partie SET, il faut mettre les alias de tables sinon le SGBD ne va pas forcément savoir si tu veux remplacer la valeur existante par elle-même ou si tu veux affecter la valeur d'une table à l'autre.

    Plutôt que getDate(), il vaut mieux utiliser CURRENT_DATE qui est du SQL standard.

    Bref, j'ai l'impression que tu as besoin de cours SQL.

    Le principe de la jointure est qu'on joint des tables entre elles sur une condition de jointure qui porte sur une ou plusieurs informations communes, en principe la clé primaire d'une table qui se retrouve clé étrangère dans l'autre table.

    Exemple :
    Règle de gestion :
    Une entreprise a de une à plusieurs adresses et une adresse n'appartient qu'à une seule entreprise.

    MCD (méthode Merise) :
    entreprise -1,n----avoir----1,1- adresse -1,1----situer----0,n- ville

    Tables :
    entreprise (ent_id, ent_nom...)
    ville (vil_id, vil_nom...)
    adresse (adr_id, adr_id_entreprise, adr_id_ville, adr_rue, adr_code_postal)

    On aurait pu même faire mieux que ça mais c'est juste un exemple.

    Quelles sont les adresses de l'entreprise X ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT a.adr_rue, a.adr_code_postal, v.vil_nom
    FROM adresse a
    INNER JOIN entreprise e ON e.ent_id = a.adr_id_entreprise
    INNER JOIN ville v ON v.vil_id = a.adr_id_ville
    Si j'ai fait une faute en saisissant la partie rue de l'adresse, je peux la modifier ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE adresse a
    INNER JOIN entreprise e ON e.ent_id = a.adr_id_entreprise
    SET a.adr_rue = '1bis rue nouvelle'
    WHERE e.ent_nom = 'Dupont SA'
      AND a.adr_rue = '1 rue ancienne'
      AND a.adr_code_postal = '31000'
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Nouveau membre du Club
    Inscrit en
    Avril 2010
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 42
    Points : 27
    Points
    27
    Par défaut
    Voici la structure de la table dim_address:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    CREATE TABLE `dim_address` (
      `address_sk` int(11) NOT NULL AUTO_INCREMENT,
      `document_id` int(11) DEFAULT NULL,
      `document_model` varchar(255) DEFAULT NULL,
      `document_label` varchar(255) DEFAULT NULL,
      `firstname` varchar(255) DEFAULT NULL,
      `lastname` varchar(255) DEFAULT NULL,
      `email` varchar(255) DEFAULT NULL,
      `company` varchar(50) DEFAULT NULL,
      `addressline1` varchar(255) DEFAULT NULL,
      `addressline2` varchar(255) DEFAULT NULL,
      `addressline3` varchar(50) DEFAULT NULL,
      `zipcode` varchar(255) DEFAULT NULL,
      `city` varchar(255) DEFAULT NULL,
      `province` varchar(255) DEFAULT NULL,
      `countryid` int(11) DEFAULT NULL,
      `phone` varchar(255) DEFAULT NULL,
      `mobilephone` varchar(255) DEFAULT NULL,
      `document_creationdate` date DEFAULT NULL,
      `document_modificationdate` date DEFAULT NULL,
      `creationDWdate` date DEFAULT NULL,
      `modificationDWdate` date DEFAULT NULL,
      `suppressionDWdate` date DEFAULT NULL,
      `debutvalidite` date DEFAULT NULL,
      `finvalidite` date DEFAULT NULL,
      `isactive` int(2) DEFAULT NULL,
      PRIMARY KEY (`address_sk`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 ;
    Quant à la structure de la table m_customer_doc_address , j'extrais les informations de cette table pour remplir la dim_address moins les champs _sk et les derniers champs. Ses informations sont donc:
    - `document_id`
    - `document_model`
    - `document_label`
    - `firstname`
    - `lastname`
    - `email`
    - `company`
    - `addressline1`
    - `addressline2`
    - `addressline3`
    - `zipcode`
    - `city`
    - `province`
    - `countryid`
    - `phone`
    - `mobilephone`
    - `document_creationdate`
    - `document_modificationdate`

    Merci de ta compréhension.

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Depuis le début de la discussion, on parle d'UPDATE (mise à jour)...
    j'extrais les informations de cette table pour remplir la dim_address
    Tu veux remplir la table (insérer des lignes) ou mettre à jour la table (modifier les lignes existantes) ?

    VARCHAR(255) pour la plupart des colonnes qui sont affublées de ce type, c'est largement dimensionné !

    Puisqu'il y a un document_id qui semble donc être une clé étrangère, il ne devrait pas y avoir document_label et document_model qui semblent être des propriétés du document ; on peut les retrouver par jointure avec la table des documents.

    N'as-tu pas une table des personnes et des compagnies ? Il faudrait plutôt ici une clé étrangère comme je l'ai fait dans mon exemple du message précédent.

    La city devrait être externalisée dans une table de référence des villes.

    Il y a aussi redondance de données puisque figurent à la fois city, countryid et province. Tout devrait se déduire par jointure à partir de l'identifiant de la city.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  8. #8
    Nouveau membre du Club
    Inscrit en
    Avril 2010
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 42
    Points : 27
    Points
    27
    Par défaut
    J'utilise la structure d'une base de données en place pour construire mon entrepôt de données (datawarehouse). J'ai déjà extrait les informations que j'ai mis dans dim_address.

    Et maintenant, je veux mettre à jour les champs qui ont changé dans ma table de production (m_customer_doc_address).

    C'est donc une mise à jour de l’entrepôt de données (dim_address) que je suis en train de faire.

    Je m'explique: Supposons que la ville du client change. Si on lance la mise à jour, elle doit pouvoir comparer les champs correspondants (entre la base de production et l'entrepôt) et, le cas échéant, changer l'ancienne valeur par la nouvelle valeur (le changement se fait donc dans l’entrepôt vu que il a été modifié dans la base de production par l'utilisateur. Voilà un peu le problème que je veux résoudre.

    Merci de votre compréhension.

Discussions similaires

  1. UPDATE SET FROM
    Par aigleborgne dans le forum Développement
    Réponses: 3
    Dernier message: 16/10/2010, 09h53
  2. [AC-2002] Pb "Update select from where"
    Par babycoca dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 25/05/2009, 19h06
  3. [Requête SQL] Optimisation de plusieurs UPDATE SET FROM
    Par dens19 dans le forum Développement
    Réponses: 6
    Dernier message: 13/03/2009, 16h51
  4. [2K5]Syntaxe Update Set From Join Group by
    Par Monstros Velu dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/10/2007, 10h57
  5. Réponses: 2
    Dernier message: 02/12/2005, 17h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo