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 :

Valeur d'un attribut de requête


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 421
    Points : 0
    Points
    0
    Par défaut Valeur d'un attribut de requête
    bonjour j'ai besoin d'aide je dois faire un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update NOM_TABLE set GLOBAL = '887' — valeur issue de la requête
    la valeur de la requête
    me donne 6 nom de colonnes
    avec NC qui correspond a GLOBAL j'ai stocker le resultat de la requête dans un curseur et je le parcour avec un nom de varriable enreg
    et je mets a jour sauf que je ne comprends pas la syntaxe


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update NOM_TABLE set GLOBAL = '887' , enreg.NC
    merci d'avance

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    De ce que j'ai compris, je dirais :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    update NOM_TABLE set GLOBAL = enreg.NC

    Mais pour moi il manque un WHERE dans cette requête : sinon tu vas mettre à jour, pour chaque ligne enreg, toutes les lignes de NOM_TABLE avec la même valeur.
    Ainsi, à la fin, toutes les lignes de NOM_TABLE auront la colonne GLOBAL égale à la dernière valeur de NC d'enreg…

    Pas certain que ce soit ce que tu veuilles.

    Si enreg contient une colonne "ID" qui correpond à l'ID de la table NOM_TABLE, alors ce sera plutôt :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    update NOM_TABLE set GLOBAL = enreg.NC where ID = enreg.ID
    On ne jouit bien que de ce qu’on partage.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 421
    Points : 0
    Points
    0
    Par défaut
    merci beaucoup

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 421
    Points : 0
    Points
    0
    Par défaut
    j'avais une autre question pourquoi on peut perdre de l'information avec un where et quand on le remplace avec le outer join on la récupère (l'information ou les enregistrements)
    merci d'avance

  5. #5
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Ouhlà… J'ai mis un moment avant de comprendre !

    WHERE et OUTER JOIN (LEFT, RIGHT ou FULL) sont deux notions très différentes en SQL.

    Le JOIN (qu'il soit OUTER, INNER ou CROSS) permet quant à lui de mettre en corrélation les lignes de plusieurs tables entres elles, et de leur appliquer un filtre grâce à ON. D'un point de vue logique, il est appliqué en premier, et ne s'applique qu'à la table jointe.
    Le WHERE permet d'apporter un filtre à un ensemble de lignes. D'un point de vue logique, il s'applique après les critères de jointures, et s'applique aux lignes dans leur ensemble.

    A partir de là, c'est une erreur de penser qu'on peut remplacer l'un par l'autre (et notamment filtrer les critères de jointure dans le WHERE plutôt que dans le ON).

    Fort de cette explication, je pense j'ai compris ton problème.

    Mettons la requête suivante :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select p.nom, p.prenom, v.immatriculation
    from personne p
    left outer join voiture v on v.proprietaire_id = p.id
    where p.age >= 18

    Ceci me permet de récupérer l'ensemble des personnes de plus de 18 ans ainsi que l'immatriculation de leur voiture s'ils en ont une.

    Maintenant, si je souhaite la liste des personnes de plus de 18 ans, ainsi que leur voiture de marque Renault s'ils en ont une.

    Je suis tenté de faire mon filtre sur la marque à deux endroits : le ON et le WHERE.

    Si je le fais dans le ON, alors cela veut dire "je vais prendre toutes les personnes et rechercher leur voiture si elle est de marque Renault, puis ne conserver que les lignes où la personne a plus de 18 ans" :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select p.nom, p.prenom, v.immatriculation
    from personne p
    left outer join voiture v on v.proprietaire_id = p.id and v.marque = 'Renault'
    where p.age >= 18

    Si je le fais dans le WHERE, alors cela veut dire "je vais prendre toutes les personnes et rechercher leur voiture, puis ne conserver que les lignes où la personne a plus de 18 ans et sa voiture est de marque Renault" :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select p.nom, p.prenom, v.immatriculation
    from personne p
    left outer join voiture v on v.proprietaire_id = p.id
    where p.age >= 18
    and v.marque = 'Renault'

    Pour pallier à ce comportement, sur certains SGBD qui n'acceptent par exemple pas les constantes dans le ON, on peut utiliser une astuce : vérifier dans le where la valeur ou NULL : comme ça si la table jointe n'a pas retourné de valeur, on conserve la ligne quand même.
    Seul bémol, si la colonne filtrée contient des NULL… on obtiendra ces lignes qu'on ne souhaite pourtant pas avoir. A ce moment il faut aussi plutôt comparer une colonne non nulle (l'ID par exemple) et la requête commence à ne plus ressembler à rien :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select p.nom, p.prenom, v.immatriculation
    from personne p
    left outer join voiture v on v.proprietaire_id = p.id
    where p.age >= 18
    and (v.marque = 'Renault' or v.id is null)
    => A la première lecture, on est tenté de virer ce "v.id is null" qui ne veut rien dire puisque v.id n'est pas nullable… et pourtant !

    Bref, dans un WHERE, on ne devrait, en général, n'avoir que des filtres appliqués sur la table immédiatement présente après le FROM. Toutes les tables jointes doivent être filtrées dans les clauses ON de leurs jointures respectives.
    On ne jouit bien que de ce qu’on partage.

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 421
    Points : 0
    Points
    0
    Par défaut
    merci beaucoup mais on me demande de transformer cette requête avec une jointure externe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select A.* 
    ,(select count() from Table1) CT 
    from (
    select distinct champ1 , champ2 NOREFNC 
    from table2
    ) A
    ) A2
    where ct = 0 and A2.norefnc like '18%'
    le problème est dans le ct = 0
    merci d'avance

  7. #7
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    C'est quoi le lien entre table1 et table2 ?

    Car là il manque un truc. Pour chaque ligne de la sous-requête A on indique le nombre de lignes de la table1 sans corréler les données entre elles.

    Donc si table1 est vide, ça ne retourne aucune ligne. Et si table1 n'est pas vide, ça retourne toutes les lignes de A.
    Ca me semble un peu étrange...
    On ne jouit bien que de ce qu’on partage.

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 421
    Points : 0
    Points
    0
    Par défaut
    merci mais je me suis trompe voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select A.* 
    ,(select count() from Table1 where Table1 .norefndd = A.norefnc) CT 
    from (
    select distinct norefndd , norefnc NOREFNC 
    from Table1 
    ) A
    ) A2
    where ct = 0 and A2.norefnc like '18%
    ca donne des enregistrements nul
    et je dois faire une jointure externe je ne vois comment

Discussions similaires

  1. transmettre valeur d'un champ à une requête
    Par zut94 dans le forum Access
    Réponses: 3
    Dernier message: 13/10/2005, 16h23
  2. Récupérer valeur contrôle en dynamique via requête
    Par nicburger dans le forum Access
    Réponses: 10
    Dernier message: 15/09/2005, 15h41
  3. [XSD] test de la valeur d'un attribut
    Par ka0z dans le forum Valider
    Réponses: 3
    Dernier message: 21/08/2005, 20h46
  4. Réponses: 2
    Dernier message: 07/07/2005, 18h11
  5. Valeur d'un attribut
    Par DarkMoox dans le forum Requêtes
    Réponses: 5
    Dernier message: 10/10/2004, 18h31

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