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

MS SQL Server Discussion :

Besoin d'aide pour une requête SQL


Sujet :

MS SQL Server

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 38
    Points : 30
    Points
    30
    Par défaut Besoin d'aide pour une requête SQL
    Bonjour,

    Voici mon problème :
    Je dispose de 3 tables, tableA, tableB, tableC qui se lient de la manière suivante

    tableA | tableB | tableC
    Code----Code | Prix
    Prix | Id------Id

    Je voudrait mettre a jour le prix de la tableC grâce au prix de la tableA

    J'ai essayer la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    UPDATE tableC SET Prix = (SELECT tableA.Prix
    FROM tableC INNER JOIN
    tableB ON tableC.Id = tableB.Id INNER JOIN
    tableA ON tableB.Code = tableA.Code) 
     
    WHERE tableC.Id = (SELECT tableB.Id
    FROM tableC INNER JOIN
    tableB ON tableC.Id = tableB.Id INNER JOIN
    tableA ON tableB.Code = tableA.Code)
    Mais j'obtiens l'erreur suivante :

    Serveur*: Msg 512, Niveau 16, État 1, Ligne 1
    La sous-requête a retourné plusieurs valeurs. Cela n'est pas autorisé quand la sous-requête suit =, !=, <, <= , >, >= ou quand elle est utilisée en tant qu'expression.
    L'instruction a été arrêtée.
    Est ce que le problème vient de ma requête ?

    Merci

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Faites simple !

    Essayez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE dbo.tableC
    SET Prix = A.prix
    FROM dbo.TableC AS C
    JOIN dbo.tableB AS B
    	ON C.Id = B.Id
    JOIN dbo.TableA AS A
    	 ON B.Code = A.Code
    @++

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 38
    Points : 30
    Points
    30
    Par défaut
    Bonjour,

    Un grand merci sa fonctionne très bien

    Cependant je voudrais ajouter une condition sur le champ 'Type' de la tableC

    Ma requête deviens

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE dbo.tableC
    SET Prix = A.prix
    WHERE tableC.Type='A'
    FROM dbo.TableC AS C
    JOIN dbo.tableB AS B
    	ON C.Id = B.Id
    JOIN dbo.TableA AS A
    	 ON B.Code = A.Code
    Seulement j'obtiens l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Syntaxe incorrecte vers le mot clé 'FROM'.
    Avez-vous solution ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    Bonjour,

    Je crois qu'il faut mettre la condition FROM ainsi que les JOINTURES avant la condition WHERE mais je peux me tromper.

    cordialement

  5. #5
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 38
    Points : 30
    Points
    30
    Par défaut
    Oui désoler ....

    La requête deviens donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE dbo.tableC
    SET Prix = A.prix
    FROM dbo.TableC AS C
    JOIN dbo.tableB AS B
    	ON C.Id = B.Id
    JOIN dbo.TableA AS A
    	 ON B.Code = A.Code
    WHERE tableC.Type='A'
    Mais j'obtiens l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Le préfixe de colonne 'tableC' ne correspond ni au nom de table ni au nom d'alias utilisés dans la requête.
    Alors que mon nom de champ est correct

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    bonjour,

    ah je n'avait pas vu les "dbo.".

    dbo pour database object.

    retire les dbo. devant les noms de tes tables.

    Un autre élément me parait bizarre dans la syntaxe de tes jointures.

    Si je dit pas de betise la syntaxe est INNER JOIN.

    Mais vu qu'il existe plusieurs type de jointure je ne sais pas laquelle tu souhaites utilisé.

    Je pense que ca devrait resoudre ton soucis.

    ++

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Citation Envoyé par narutobaka Voir le message
    retire les dbo. devant les noms de tes tables.
    Très mauvaise idée, et vous allez en plus vous faire taper sur les doigts !
    Il suffit simplement d'utiliser les alias des tables précédement déclarés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE C
       SET C.Prix = A.prix
      FROM dbo.TableC AS C
           INNER JOIN dbo.tableB AS B
             ON B.Id = C.Id
           INNER JOIN dbo.TableA AS A
             ON A.Code = B.Code
     WHERE C.Type = 'A'

  8. #8
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Très mauvaise idée, et vous allez en plus vous faire taper sur les doigts !
    Je confirme ce que dit Waldar, et la fessée étant en passe d'être interdite, je ne vois pas d'autre solution que de devoir effectivement vous taper sur les doigts !
    Non, en fait il est important de mettre dbo devant le nom des tables car cela évite à SQL Server de rechercher le propriétaire de la table dans les tables de métadonnées et de le comparer à l'utilisateur qui exécute la procédure stockée.
    C'est un moyen très simple d'obtenir un gain de performances important sur une charge de travail sous SQL Server 2000 (gain de 300-400 transactions par secondes)
    Le gain est plus faible dès SQL Server 2005, mais il y a gain quand même : 100 transactions par seconde

    J'ai "omis" le INNER dans la spécification de la jointure par habitude de codage.
    En fait l'INNER spécifie une équi-jointure, mais à mon sens quand on effectue une jointure sans préciser le mot clé INNER, on spécifie une jointure naturelle ...

    Dans vos requêtes, une fois que vous avez aliasé vos tables, toutes les références que vous y faites en dehors de la jointure (FROM et JOIN) doit utiliser l'alias

    @++

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    Bonjour,

    Le gain est plus faible dès SQL Server 2005, mais il y a gain quand même : 100 transactions par seconde
    Autant pour moi je ne savais pas que laisser cette extension permettait un gain de performance. Merci pour l'astuce. Enregistré et je ne ferai plus l'erreur.

    ++

  10. #10
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 38
    Points : 30
    Points
    30
    Par défaut
    Bonjour,

    Merci pour votre aide et ces informations intéressantes

    ++

Discussions similaires

  1. besoin d'aide pour une requête SQL
    Par cedrix57 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 11/01/2010, 10h47
  2. Besoin d'aide pour une requête SQL
    Par sexy-meta dans le forum Langage SQL
    Réponses: 6
    Dernier message: 08/07/2008, 14h36
  3. Besoin d'aide pour une requête SQL
    Par FranckyVegas dans le forum Langage SQL
    Réponses: 7
    Dernier message: 27/05/2008, 20h16
  4. Besoin d'aide pour une requête SQL
    Par Borami dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/11/2005, 10h33
  5. Besoin d'aide pour une Requête SQL ...
    Par Kokito dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/07/2004, 11h56

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