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 :

[requete imbriquee] possible ou pas?


Sujet :

Langage SQL

  1. #1
    Membre actif
    Inscrit en
    Juin 2006
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 273
    Points : 258
    Points
    258
    Par défaut [requete imbriquee] possible ou pas?
    Je possede une table T_Item ou j'ai une liste de produits avec les infos relatives au produit:code de reference appele WID code, designation... et aussi une colonne "Outer" qui renvoie le WID code du carton dans lequel est range l'item.

    Je voudrais faire une requete qui renvoie pour un WID code de la table T_ManufactureOrder_Weld la designation de ce produit, mais aussi la designation du carton dans lequel il est. Pour l'instant je n'ai pas reussi donc j'ai separe en 2 requetes:

    Requete Q_ManufactureOrder_Weld_Info sur le produit qui donne le wid code du carton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T_ManufactureOrder_Weld.WIDWanted, T_Item.Designation1,  T_Item.Outer
     
    FROM T_Item INNER JOIN T_ManufactureOrder_Weld ON T_Item.WIDCode=T_ManufactureOrder_Weld.WIDWanted;
    Requete qui donne les infos sur le carton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Q_ManufactureOrder_Weld_Info.Outer, T_Item.Designation1
     
    FROM T_Item INNER JOIN Q_ManufactureOrder_Weld_Info ON T_Item.WIDCode = Q_ManufactureOrder_Weld_Info.Outer;
    Apres j'ai une requete qui va chercher les champs des 2 requetes mais je trouve ca un peu inutile et je voudrais savoir si c'est possible de tout mettre dans ma premiere requete, j'ai essaye quelques combinaisons par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T_ManufactureOrder_Weld.WIDWanted, T_Item.Designation1,  T_Item.Outer, (SELECT  T_Item.Designation1 FROM T_Item WHERE  T_Item.WIDCode = Outer) AS Designation1Outer
     
    FROM T_Item INNER JOIN T_ManufactureOrder_Weld ON T_Item.WIDCode=T_ManufactureOrder_Weld.WIDWanted;
    mais ca ne me renvoie rien dans la colonne Designation1Outer, je pense qu'il ne sait pas reprendre la valeur Outer du debut de la requete ou ce n'est pas assez explicite pour qu'il sache quels enregistrements chercher. Est-ce que vous savez si c'est possible d'arranger ca autrement pour que ca marche? (je suis sous Access au fait, mais je pense que c'est une question plutot basique de SQL donc je ne sais pas si c'est important )

  2. #2
    Membre actif
    Inscrit en
    Juin 2006
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 273
    Points : 258
    Points
    258
    Par défaut
    Finalement avec quelques trifouillages et vagues souvenirs de mes cours de SQL je suis arrivee a ca qui marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T_ManufactureOrder_Weld.WIDWanted, T_Item1.Designation1,  T_Item1.Outer, T_Item2.Designation1 AS Designation1Outer
    FROM T_Item AS T_Item1 INNER JOIN T_ManufactureOrder_Weld ON T_Item1.WIDCode=T_ManufactureOrder_Weld.WIDWanted, T_Item AS T_Item2
    WHERE T_Item1.Outer = T_Item2.WIDCode;
    C'est bien la solution? il n'y a pas moyen de recuperer un champ du debut de la requete pour mettre dans la condition WHERE? Par exemple si au lieu de T_Item1.Outer j'avais un champ calcule par exemple...

  3. #3
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    C'est à peu près l'idée, mis à part une confusion entre JOIN ON et WHERE vers la fin.
    J'ai changé tes alias pour que ça devienne un peu plus lisible (pour moi en tous cas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT T_ManufactureOrder_Weld.WIDWanted, 
    Produit.Designation1,  
    Produit.Outer, 
    Carton.Designation1 AS Designation1Outer
    FROM T_Item AS Produit
    INNER JOIN T_ManufactureOrder_Weld ON Produit.WIDCode=T_ManufactureOrder_Weld.WIDWanted
    INNER JOIN T_Item AS Carton
    ON Carton.WIDCode = T_ManufactureOrder_Weld.Outer
    WHERE {Condition de recherche}
    Code corrigé

    Et dans ta condition de recherche, tu mets ce que tu veux : par exemple,
    code ou désignation de produit ou de carton.

  4. #4
    Membre actif
    Inscrit en
    Juin 2006
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 273
    Points : 258
    Points
    258
    Par défaut
    Merci effectivement c'est plus clair!

    Par contre pour ma 2eme interrogation je vais essayer d'etre un peu plus claire: pour les cartons pas de probleme puisqu'il suffit de prendre la valeur de T_Item.Outer pour connaitre le carton dans lequel est mis le stylo.

    Par contre pour les capuchons, suivant si on choisit d'utiliser un capuchon chinois ou francais dans l'ordre de production (dans la table T_ManufactureOrder_Weld), il ira chercher la valeur de Component1 ou Component2 de la table T_Item. Du coup ma requete complete ressemble a ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T_ManufactureOrder_Weld.WIDWanted, T_Item.Designation1,  T_Item.Outer, Iif(ChineseBarrel,Component1, Component2) AS Cap
     
    FROM T_Item INNER JOIN T_ManufactureOrder_Weld ON T_Item.WIDCode=T_ManufactureOrder_Weld.WIDWanted;
    Si je veux faire la meme chose que pour le carton (c'est a dire chercher la designation du cap, qui depend de la valeur du booleen ChineseBarrel) est-ce que je peux reussir a faire un JOIN avec une variable de type Cap comme condition?

  5. #5
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Je ne connais pas la syntaxe exacte du IIF (si je ne me trompe, ce n'est pas du SQL "pur"), mais le solution que je verrais serait de faire 2 JOIN supplémentaires de T_Item, sur les codes de Composant1 et Composant2 respectivement (bien sûr, comme l'un des deux ne te ramènera rien, il faut faire des jointures externes (LEFT OUTER JOIN).
    Ensuite, si on appelle Comp1 et Comp2 ces 2 jointures, dans ton SELECT, tu ajoutes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Iif(ChineseBarrel,Comp1.Designation1, Comp2.Designation2)
    NB : Le , c'était parce que les jointures, c'est bien, mais à les multiplier, les perf peuvent dégringoler. A mon sens, ce genre de champs "parallèles" est à éviter. On peut employer à la place une table auxiliaire :

    Code_Produit | Chinese | Composant
    CODE01 | Oui | ComposantX
    CODE01 | Non | ComposantY

    Du coup, tu n'as plus besoin du IIF et que d'une jointure au lieu de Deux.

  6. #6
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Relisant mon avant-dernier message, ce n'est bien sûr pas (avt -dernière ligne de code)
    Citation Envoyé par rsc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ON Carton.WIDCodeT_Item1.Outer = Carton.Outer
    mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ON Carton.WIDCode = T_ManufactureOrder_Weld.Outer

  7. #7
    Membre actif
    Inscrit en
    Juin 2006
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 273
    Points : 258
    Points
    258
    Par défaut
    Merci pour tes reponses tres detaillees rsc Bon s'il faut faire des JOIN en plus, comme mon but etait de regrouper plusieurs requetes pour rendre la base plus comprehensible aux futurs utilisateurs, ce n'est peut-etre pas une bonne idee Je m'en tiendrai donc au JOIN avec le Outer et tant pis pour les cap et barrel ils auront leurs propres requetes

Discussions similaires

  1. requete imbriquee
    Par pascale86 dans le forum Requêtes
    Réponses: 6
    Dernier message: 23/09/2005, 16h10
  2. [PL/SQL] requete qui marche mais pas dans un cursor
    Par victor.ward dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/09/2005, 23h21
  3. [SQL] requete INSERT possible?
    Par clad523 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 03/08/2005, 16h42
  4. [REQUETE][IMBRIQUEE] Bien ou pas bien?
    Par fabszn dans le forum Langage SQL
    Réponses: 31
    Dernier message: 21/04/2005, 11h57
  5. PROBLEME DE REQUETE IMBRIQUEE
    Par fleuve007 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 31/12/2003, 16h33

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