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

SQL Oracle Discussion :

[SQL] Tous les records d'une jointure pour 1 record de la table maitre


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 111
    Points : 56
    Points
    56
    Par défaut [SQL] Tous les records d'une jointure pour 1 record de la table maitre
    Bonjour à tous,

    tout d'abord je m'excuse pour le manque de clarté de mon intitulé. Je vais être plus clair ici :-)

    J'ai deux tables, A et B.
    A contient plusieurs colonnes (col1, col2). col1 est la clé primaire.
    B contient plusieurs colonnes (col1, col2, col3). col1 est une clé étrangère (de A).

    A.col1 et B.col1 ne peuvent pas être null.
    A.col2, A.col3, B.col2 et B.col3 peuvent être null.

    Pour une clé primaire de A, je peux avoir des records dans B.

    Mon but est de rapatrier pour 1 clé primaire de A n'ayant pas col2 et col3 null, l'ensemble des col2 et col3 (de B) n'étant pas null.

    Il faut absolument que cette requête retourne quelque chose. Donc il faut trouver un A.col1 tel que A.col2 != NULL && (il existe au moins un record dans B tel que A.col1 == b.col1 && col2 != NULL && col3 != NULL).

    La requête ci-dessous me donne presque ce que je veux, excepté qu'elle retourne le résultat pour tous les A.col1. Il faudrait limiter le résultat a 1 seul A.col1 ... Une idée ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT A.col1
         , A.col2
         , B.col2
         , B.col3
    FROM A, B 
    WHERE A.col1 IS NOT NULL 
      AND A.col2 IS NOT NULL 
      AND A.col1 = B.col1
      AND B.col2 IS NOT NULL
      AND B.col3 IS NOT NULL 
    ORDER BY A.col1;
    J'espère que mes explications sont assez claires :-)

    D'avance, je vous remercie.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Un exemple avec des données serait plus clair

    On ne sait pas vraiment ce que votre requête doit retourner, et que faire si on trouve plusieurs A.col1 qui répondent à tous vos critères ? Vous dites en vouloir en ramener un seul, d'accord mais vous ne dites pas comment le choisir.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 111
    Points : 56
    Points
    56
    Par défaut
    Oui en effet, je pense que donner un exemple est une bonne idée ...

    Soit la table A :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Col1    | Col2
    --------------    
    truc    | azer    
    aaaa    | null 
    wxcv    | qsdf   
    jklm    | poiu    
    fggh    | cvbn
    Et la table B :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Col1    | Col2    | Col3
    ------------------------
    truc    | null    | null 
    truc    | choz    | null 
    truc    | null    | bazar
    aaaa    | null    | sdfg
    wxcv    | qsdf    | NULL
    jklm    | poiu    | sdfg
    jklm    | kjhk    | wxcv
    jklm    | 1234    | 4321
    fggh    | nbvc    | fhjfjhgf
    fggh    | iuyt    | fhjfjhgf
    En effectuant la requête du message 1, j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    A.Col1  | A.Col2  | B.Col1  | B.Col2  | B.Col3
    ------------------------------------------------
    jklm    | poiu    | jklm    | poiu    | sdfg
    jklm    | poiu    | jklm    | kjhk    | wxcv
    jklm    | poiu    | jklm    | 1234    | 4321
    fggh    | cvbn    | fggh    | nbvc    | fhjfjhgf
    fggh    | cvbn    | fggh    | iuyt    | fhjfjhgf
    Il faudrait que j'obtienne :
    - soit tous les records (du résultat) pour lesquels A.Col1 = jklm
    - soit tous les records pour lesquels A.Col1 = fggh
    En réalité la valeur de A.Col1 n'a pas d'importance ... il faut juste que j'ai l'ensemble des records pour 1 valeur de A.Col1

    Voilà, j'espère que ma question est un peu plus compréhensible ^_^

  4. #4
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Si tu pouvais attribuer des numéros aux lignes par valeur de col1 (avec des ex-aequo bien sûr), ça serait gagné.

    Bingo, on a les fonctions analytiques.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT * 
    FROM (
      SELECT a.*, DENSE_RANK() OVER(ORDER BY col1) rk
      FROM TaJointure a
    ) t
    WHERE t.rk = 1
    (Tu pourras te documenter sur les fonctions analytiques qui font vraiment plein de trucs utiles)

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 111
    Points : 56
    Points
    56
    Par défaut
    Trop foooort ! :-)

    Merci.

    C'est déjà la 2° fois que des fonctions analytiques viennent à ma rescousse (l'autre fois c'était un rownumber() over partition by ...)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment attendre que tous les thread lancés soient morts pour lancer une action.
    Par rgesnot dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 31/03/2007, 20h27
  2. [SQL] problème de variable tableau PHP contenant les données d'une jointure SQL
    Par Schpountz42 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 09/02/2007, 05h59
  3. SELECT pour avoir tous les TS d'une database
    Par genio dans le forum DB2
    Réponses: 5
    Dernier message: 21/08/2006, 12h11
  4. Réponses: 4
    Dernier message: 29/09/2005, 11h50
  5. Réponses: 7
    Dernier message: 08/01/2005, 13h24

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