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 :

Besoin d'aide sur requete sql : intersection multi critères


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 5
    Par défaut Besoin d'aide sur requete sql : intersection multi critères
    Bonjour,

    Pour les amateurs de retournement de cerveau, j'ai donc une requête qui me pose une sérieuse colle ...

    Ci joint un schéma, pour mieux comprendre mes futures explications :


    Point d'entrée de la requête : un id sur la table M
    Une relation de N..N existe entre M et T (donc M => 1..N <=> MT <=> N..1 <= T)
    Une relation de N..N existe entre F et T (donc T => 1..N <=> FT <=> N..1 <= F)

    Sortie : je veux tous les F ayant au moins tous les T contenus dans le M selectionné

    l'idée serait donc la suivante (mais bien entendu, cette requête est absolument fausse) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    SELECT F.id_F
    FROM F
    WHERE 
    	ALL
    	(
    		SELECT FT.id_T
    		FROM FT
    		WHERE FT.id_F = F.id_F
    	)
    	IN
    	(
    		SELECT MT.id_T
    		FROM MT
    		WHERE MT.id_M=XXX
    	)
    où XXX est le point d'entrée

    Si quelqu'un veut bien m'aider et comprend le problème, je l'en remercie par avance

    PS : je suis sous oracle, si ça peut aider (ou pas :p)

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT  f.id_f
    FROM    f     
    WHERE   NOT EXISTS
            (   SELECT  ft.id_t
                FROM    ft     
                WHERE   ft.id_f = f.id_f
                    AND ft.id_t NOT IN
                        (   SELECT  mt.id_t
                            FROM    mt     
                            WHERE   mt.id_m = xxx
                        )
            )
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 5
    Par défaut
    Je viens de tester, et non malheureusement ce n'est pas bon

    Apparement, cette requete donne presque tout l'inverse =), à savoir que ça donne tous les F qui n'ont aucun des T reliés au M sélectionné

    Si on change le NOT EXISTS par EXISTS et le NOT IN par IN, on obtient tous les F ayant au moins 1 des T reliés au M sélectionné, on se rapproche un peu de ce que je recherche, mais j'avais déjà reussi à obtenir un résultat équivalent par des jointures simples entre les tables.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Par défaut
    Voilà ce à quoi j'ai pensé, à adapter car on n'a pas tes structures de tables :
    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 DISTINCT F.col1
    MINUS
    SELECT DISTINCT R0.col1
    FROM (SELECT R2.col1, NVL(R1.col1, 'ZZZ') flag
          FROM (SELECT M.champ col1, T.champ col2
                FROM M, T
                WHERE M.id = T.id
                AND M.id = <param>) R1,
               (SELECT F.champ col1, T.champ col2
                FROM F, T
                WHERE F.id = T.id) R2
          WHERE R2.col1 = R1.col1 (+)) R0
    WHERE flag = 'ZZZ'
    Cela suppose que tes relations sont bien 1..N et non 0..N
    Tiens-nous au courant.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 5
    Par défaut
    oula, j'ai essayé de comprendre ta requête en remplaçant par mes vrais champs, mais j'ai l'impression qu'il y a un gros problème de compréhension

    Je vais donc mettre une structure minimale pour mes tables :

    Table T :
    id_T integer (PK)

    Table M :
    id_M integer (PK)

    Table F :
    id_F integer (PK)

    table FT :
    id_F integer
    id_T integer
    - Les 2 champs forment la PK
    - id_F clé étrangere sur F.id_F
    - id_T clé étrangere sur F.id_T

    table MT :
    id_M integer
    id_T integer
    - Les 2 champs forment la PK
    - id_M clé étrangere sur M.id_M
    - id_T clé étrangere sur F.id_T

    Peux tu reformuler ta requete avec ces éléménts ?


    Sinon j'ai réussi a formuler une requête qui me donne les résultats que je veux, le problème c'est qu'elle est loin d'être optimisée à mon avis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    SELECT id_F
    	FROM
    		(
    			SELECT id_F, count(*) as nb
    			FROM
    				(
    					SELECT MT.id_T, FT.id_F
    						FROM MT, FT
    						WHERE id_M=XXX
    					INTERSECT
    					SELECT FT.id_T, FT.id_F
    					FROM FT
    				)
    			GROUP BY id_F
    		)
    	WHERE nb IN (
    				SELECT count(*) 
    				FROM MT 
    				WHERE id_M=XXX
    			)

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Par défaut
    La traduction :
    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 DISTINCT F.id_F
    MINUS
    SELECT DISTINCT R0.id_F
    FROM (SELECT R2.id_F, NVL(R1.id_M, 'ZZZ') flag
          FROM (SELECT M.id_M, MT.id_T
                FROM M, MT
                WHERE M.id_M = MT.id_M
                AND M.id_M = <param>) R1,
               (SELECT F.id_F, FT.id_T
                FROM F, FT
                WHERE F.id_F = FT.id_F) R2
          WHERE R2.id_T = R1.id_T (+)) R0
    WHERE flag = 'ZZZ'

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

Discussions similaires

  1. Besoin d'aide sur requete SQL
    Par s.godquin dans le forum Langage SQL
    Réponses: 1
    Dernier message: 16/04/2009, 10h34
  2. Besoin d'aide sur erreur sql
    Par stagos dans le forum Langage SQL
    Réponses: 2
    Dernier message: 21/11/2007, 11h47
  3. Aide sur requete SQL
    Par rippoz dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/07/2007, 11h46
  4. Besoin d'aide sur requetes imbriquées simples
    Par Kyti dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/03/2006, 10h52

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