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 :

Problème de requete SQL


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 16
    Points : 10
    Points
    10
    Par défaut Problème de requete SQL
    Bonjour, J'ai un problème de requête (comme vous pouvez vous en douter :p)

    Je dispose de 3 tables

    Table A
    -------
    NOM
    -------
    NOM 1
    NOM 2
    NOM 3

    TABLE B
    -------
    TYPE
    -------
    TYPE 1
    TYPE 2
    TYPE 3


    et une troisième table qui est une table de jointure entre ces deux tables (relation n-n)

    TABLE C
    --------------
    NOM TYPE
    --------------
    NOM 1 TYPE 1
    NOM 2 TYPE 1
    NOM 2 TYPE 2

    Ce que je souhaite obtenir est un résultat sur 2 colonnes:
    Pour un Nom donné de la table A
    la première colonne contient tout les types de la table B et la seconde colonne m'indique si oui ou non le type est présent dans la table C.


    Exemple:
    --------

    Pour Nom 1:

    Résultat
    -----------
    Type 1 oui
    Type 2 non
    Type 3 non


    Pour Nom 2:

    Résultat
    ------------
    Type 1 oui
    Type 2 oui
    Type 3 non


    (J'ai bien conscience, que je n'ai pas besoin d'utiliser la table A, je la présente juste pour info)

    Voilà, en espérant que ma question est claire et que l'un d'entre vous pourra m'éclaircir.

    D'avance merci.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Points : 344
    Points
    344
    Par défaut
    Salut,
    Voici un example de requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT *
    FROM (
    	SELECT a.NOM,b.TYPE,'oui' AS RESULTAT FROM TABLEA a, TABLEB b WHERE EXISTS (SELECT 1 FROM TABLEC c WHERE a.NOM=c.NOM AND b.TYPE=c.TYPE)
    	UNION ALL
    	SELECT a.NOM,b.TYPE,'nom' AS RESULTAT FROM TABLEA a, TABLEB b WHERE NOT EXISTS (SELECT 1 FROM TABLEC c WHERE a.NOM=c.NOM AND b.TYPE=c.TYPE)
    	)
    ORDER BY NOM,TYPE
    Note: j'ai tout mis dans une sous requete pour pouvoir ordonner, mais c'est pas obligatoire...

    ---
    Farid

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    D'abord, merci pour la rapidité de ta réponse Farid, mais le problème persiste

    Je suis sous Interbase Firebird et cet oiseau la semble ne pas gérer les sous-requêtes

    Aurais-tu une autre solution à mon problème en une seule requête si possible


    Xristof

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Points : 344
    Points
    344
    Par défaut
    ahhh..
    hum...
    et la requete suivante marche ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT a.NOM,b.TYPE,'oui' AS RESULTAT FROM TABLEA a, TABLEB b WHERE EXISTS (SELECT 1 FROM TABLEC c WHERE a.NOM=c.NOM AND b.TYPE=c.TYPE)
    UNION ALL
    SELECT a.NOM,b.TYPE,'nom' AS RESULTAT FROM TABLEA a, TABLEB b WHERE NOT EXISTS (SELECT 1 FROM TABLEC c WHERE a.NOM=c.NOM AND b.TYPE=c.TYPE)
    ---
    Farid

  5. #5
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    Alors...

    Ce coup-ci la requête compile c'est un bon point
    Mais elle me ramène un peu trop de résultat, Il me faudrait les résultat pour un Nom donné comme je l'explique dans mes exemples


    En fait, je viens de trouver réponse à cette question

    Et bien, un grand merci à toi

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Points : 344
    Points
    344
    Par défaut
    voila, il suffit de remplacer TOTO par le nom que tu veux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT a.NOM,b.TYPE,'oui' AS RESULTAT 
    FROM TABLEA a, TABLEB b 
    WHERE a.NOM='TOTO' AND EXISTS (SELECT 1 FROM TABLEC c WHERE c.NOM AND b.TYPE=c.TYPE)
    UNION ALL
    SELECT a.NOM,b.TYPE,'non' AS RESULTAT 
    FROM TABLEA a, TABLEB b 
    WHERE a.NOM='TOTO' AND NOT EXISTS (SELECT 1 FROM TABLEC c WHERE a.NOM=c.NOM AND b.TYPE=c.TYPE)
    ---
    Farid

  7. #7
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    Yep, j'avais trouvé, cette partie était assez simple à résoudre par contre pour tout le reste, j'pense que j'aurais bien galerer sans toi, encore merci

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Points : 344
    Points
    344
    Par défaut
    pas de soucis.
    Bonne continuation,
    ---
    Farid

  9. #9
    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
    L'idée du produit cartésien est séduisante, mais pourquoi faire cet union qui ne me semble pas nécessaire, une jointure externe fait très bien l'affaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    select
        a.nom, -- pas nécessaire si vous filtrez sur un nom
        b.type,
        case when c.nom is null then 'non' else 'oui' end as resultat
    from
        TableA a cross join TableB b -- si Interbase ne supporte pas cette écriture vous pouvez faire (TableA a, TableB b), les parenthèses seront je pense nécessaires
        left outer join TableC c
          on c.nom = a.nom
         and c.type = b.type
    where
        a.nom = 'NOM1' -- ici vous pouvez paramétrer votre nom, si vous enlevez le where vous avez toutes les combinaisons possibles
    order by
        a.nom asc, -- pas nécessaire si vous filtrez sur un nom
        b.type asc

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Points : 344
    Points
    344
    Par défaut
    Salut,

    J'ai surtout voulue faire simple a comprendre dans un premier temps quitte a optimiser plus tard car je n'ai pas l'impression que l'initiateur de ce thread connait bien le SQL, mais aussi du fait que je ne savais pas quelle DB il y avait derriere.

    Par contre je prends note du "CROSS JOIN" que je ne connaissais pas.

    ---
    Farid

  11. #11
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    La seconde solution est certes plaisante mais malheureusement la version d'interbase sur laquelle je travaille n'implémente pas le CASE

  12. #12
    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 Diablo64 Voir le message
    La seconde solution est certes plaisante mais malheureusement la version d'interbase sur laquelle je travaille n'implémente pas le CASE
    http://www.firebirdfaq.org/faq294/
    CASE is introduced in Firebird 1.5.

    Avec quelle version travaillez-vous ?

  13. #13
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    Actuellement la 1.0.3, donc pas trop possible d'utiliser ce genre d'instruction.
    Mais une migration vers une version plus actuelle est envisagé, donc je garde ta méthode de coté

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

Discussions similaires

  1. Problème avec requete SQL/type NumAuto
    Par Mimisio dans le forum VBA Access
    Réponses: 5
    Dernier message: 27/07/2007, 11h56
  2. problème lancement requete sql
    Par skanderb dans le forum JSF
    Réponses: 4
    Dernier message: 02/05/2007, 16h46
  3. [WD 11] problème de requete SQL-LIKE
    Par fabpeden dans le forum WinDev
    Réponses: 5
    Dernier message: 24/04/2007, 17h07
  4. problème de requete SQL et recherche
    Par franfr57 dans le forum ASP
    Réponses: 1
    Dernier message: 16/03/2006, 13h33
  5. [ACCESS][SQL] Problème avec requete SQL ...
    Par mpascolo dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 09/11/2005, 10h54

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