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 :

[SQL Server 2000] Requête tordue


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 37
    Points : 37
    Points
    37
    Par défaut [SQL Server 2000] Requête tordue
    Bonjour à tous.

    tout d'abord une explication succinte:
    - Ma base contient des livres qui sont mis à disposition d'un utilisateur
    - Ces livres ont des informations ventilées dans différentes tables
    - L'utilisateur peut choisir des livres en cochant une cas dans un outil web
    - Lorsque s'affichage la page il doit y avoir l'ensemble des livres sélectionnables et ceux déjà cochés (sans doublon bien entendu)
    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
    22
    23
    24
    25
    26
    /* Powered by General SQL Parser (www.sqlparser.com) */
     
    SELECT DISTINCT 
           ED.LIBELLE_EDITEUR, 
           MU.TITRE, 
           co.libelle_collection,
           ISNULL(au.identite,' ') as titre, 
           MU.ANNEE_PUBLICATION_1, 
           CONVERT(VARCHAR(4),MU.ID_MANUEL_EN_USAGE) AS IDMU, 
           CONVERT(VARCHAR(4),MU.ID_MANUEL_EN_USAGE) as IDMU2, 
           DQMU.ANNEE_ADOPTION, 
           mu.tri_titre  
    FROM 
           ENSEIGNEMENT_MANUEL EM, 
           EDITEUR ED, 
           collection co, 
           auteur au, 
           MANUEL_EN_USAGE MU inner join DETAIL_QMU DQMU 
                              ON DQMU.ID_MANUEL_EN_USAGE = MU.ID_MANUEL_EN_USAGE
           INNER JOIN DEFINIR_NIVEAU NIV 
                      on DQMU.ID_MANUEL_EN_USAGE = niv.ID_MANUEL_EN_USAGE        Inner join REF_CLASSE ref 
                       On (REF.ID_CLASSE=niv.ID_CLASSE And
                           DQMU.ID_QUESTIONNAIRE = 20721 AND 
                          (DQMU.ID_DIS = 10 OR DQMU.ID_DIS = NULL ) AND 
                           REF.ID_CLASSE=niv.ID_CLASSE AND 
                           REF.ID_NIVEAU = 206
    7Cette requête me retourne bien les données des livres sélectionnés.

    LIBELLE_EDITEUR-----TITRE-----Libelle_collection-----titre-----annee_pub-----idmu-----idmu2-----annee_adopt-----tri_titre
    ARMAND COLIN-----Allemand 4è LV1-----Sag Mal-----Hilda Kahn-----1992-----1626-----1626-----2005-----ALLEMAND 4E LV1

    - ATTENTION: Le IDMU2 doit être à NULL si le bouquin n'est PAS sélectionné (donc absent de la table DQMU)
    De fait je ne sais pas comment construire une requête selon mes données de sorte à obtenir un résultat qui dise ceci (exemple de deux livres dont un sélectionné):

    LIBELLE_EDITEUR-----TITRE-----Libelle_collection-----titre-----annee_pub-----idmu-----idmu2-----annee_adopt-----tri_titre
    ARMAND COLIN-----Allemand 4è LV1-----Sag Mal-----Hilda Kahn-----1992-----1626-----1626-----2005-----ALLEMAND 4E LV1
    ARMAND COLIN-----Allemand 4è LV2 -----Sag Mal-----Kahn Hilda-----1992-----1550-----NULL-----NULL-----ALLEMAND 4E LV2

    (désolé si c'est un peu dur à lire...)
    Bref, je cherche une manière soit:
    - De construire une requête unique capable de me retourner le résultat attendu,
    - soit une requête me retournant QUE les livres non sélectionnés.

    Pas simple pour moi... j'ai tenté via des outer join mais ceux ci me retournent alors l'intégralité des livres et non juste ceux non sélectionnés (donc absents de la table DQMU dans mon cas précis)

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 102
    Points : 28 387
    Points
    28 387
    Par défaut
    Si j'ai bien compris, DQMU contient les livres sélectionnés.
    En modifiant ta requête comme celà, tu devrais obtenir ce que tu attends :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    SELECT 
           ED.LIBELLE_EDITEUR
        ,  MU.TITRE
        ,  co.libelle_collection
        ,  ISNULL(au.identite,    ' ') AS titre
        ,  MU.ANNEE_PUBLICATION_1
        ,  CONVERT(VARCHAR(4),    MU.ID_MANUEL_EN_USAGE) AS IDMU
        ,  CONVERT(VARCHAR(4),    DQMU.ID_MANUEL_EN_USAGE) AS IDMU2
        ,  DQMU.ANNEE_ADOPTION
        ,  mu.tri_titre
    FROM
           ENSEIGNEMENT_MANUEL EM
        ,  EDITEUR ED
        ,  collection co
        ,  auteur au
        ,  MANUEL_EN_USAGE MU
        INNER JOIN
            DEFINIR_NIVEAU NIV
            ON    MU.ID_MANUEL_EN_USAGE = niv.ID_MANUEL_EN_USAGE
        INNER JOIN
            REF_CLASSE ref
            ON    REF.ID_CLASSE=niv.ID_CLASSE
        LEFT JOIN
            DETAIL_QMU DQMU
            ON    DQMU.ID_MANUEL_EN_USAGE = MU.ID_MANUEL_EN_USAGE
            AND DQMU.ID_DIS = 10 
    WHERE 
            DQMU.ID_QUESTIONNAIRE = 20721 
        AND REF.ID_NIVEAU = 206
    ;
    Toutefois, les tables ENSEIGNEMENT_MANUEL, EDITEUR, collection et auteur ne sont pas liées aux autres tables de la requête, ce qui ne doit pas manquer de créer un produit cartésien

  3. #3
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 15
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Citation Envoyé par magellan94
    (désolé si c'est un peu dur à lire...)
    Certes
    Avec un petit effort sur la syntaxe.
    Enfin bon je note déjà une première boulette
    Toutes tes jointures ne sont pas exprimées
    Tu mélanges des expressions de jointures et une restriction d'ensemble.
    Est-ce là réellement la requête qui te renvoie le résultat affiché ?

    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
    22
    23
    24
    25
    SELECT DISTINCT
            ED.LIBELLE_EDITEUR,
            MU.TITRE,
            co.libelle_collection,
            ISNULL(au.identite,' ') as titre,
            MU.ANNEE_PUBLICATION_1,
            CONVERT(VARCHAR(4),MU.ID_MANUEL_EN_USAGE) AS IDMU,
            CONVERT(VARCHAR(4),MU.ID_MANUEL_EN_USAGE) as IDMU2,
            DQMU.ANNEE_ADOPTION,
            mu.tri_titre
    FROM
           ENSEIGNEMENT_MANUEL EM,
           EDITEUR ED,
           collection co,
           auteur au,
           MANUEL_EN_USAGE MU
              inner join DETAIL_QMU DQMU    ON DQMU.ID_MANUEL_EN_USAGE = MU.ID_MANUEL_EN_USAGE
              INNER JOIN DEFINIR_NIVEAU NIV on DQMU.ID_MANUEL_EN_USAGE = niv.ID_MANUEL_EN_USAGE
              Inner join REF_CLASSE ref     On REF.ID_CLASSE=niv.ID_CLASSE
    
    WHERE DQMU.ID_QUESTIONNAIRE = 20721 
         AND (DQMU.ID_DIS = 10 OR DQMU.ID_DIS = NULL ) 
         AND REF.ID_CLASSE=niv.ID_CLASSE 
         AND REF.ID_NIVEAU = 206
    Corrige moi si je me trompe mais

    - je ne vois pas le lien entre les tables
    ENSEIGNEMENT_MANUEL EM,
    EDITEUR ED,
    collection co,
    auteur au,
    - J'ajoute aussi un WHERE pour dissocier la jointure de la restriction (il me semble).
    - IDMU et IDMU2 me semble exprimé la même information.

    Enfin je tente de réexprimer ton besoin différement pour simplifier la requête.
    Tu souhaites tous les livres sélectionnables :
    - Donc tous les livres
    à moins que tu ai quelque part l'information du sélectionneur auquel cas il s'agirait de tous les livres sauf ceux sélectionnés par quelqu'un d'autres.
    Tu souhaites y ajouter l'information sélectionné

    En un mot comme en cent(s), éclaire un peu plus notre lanterne STP.

    a+

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 37
    Points : 37
    Points
    37
    Par défaut
    Conformément à vos remarques IDMU et IDMU2 sont redondants car le programmeur précédent s'en sert pour effectuer la coche. Sans entrer dans le détail la première requête met "NULL" dans IDMU2 pour dire 'pas coché' et la seconde (unie par UNION ALL) donne 'coche'.


    Sinon pour les règles de gestion je refais une petite explication:

    - Manuel_en_usage contient les livres
    - DETAIL_qmu les livres sélectionnés

    (auteur et collection sont juste des données associées aux livres)


    Je dois retrouver tous les livres selon les critères ET retourner ceux qui sont éventuellement choisis (donc champ IDMU2 bizarre et annee_adoption de DQMU).
    J'ai un certain nombre de critères de recherches qui sont:
    - une discipline (le ID_DIS)
    - Un niveau scolaire (id_niveau)
    - Un type de classe (id_classe)

    La question qui se pose donc est (par exemple) :
    "Trouver les livres de quatrième pour tous les cours d'allemand"
    OU
    "Trouver les livres de terminale S pour les cours de phisophie"

    Je teste déjà vos propositions pour voir ce que j'ai raté...
    Merci de coup de main je vous fais des retours dès que j'identifie ce qui fonctionne.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 37
    Points : 37
    Points
    37
    Par défaut
    Effectivement concernant ma requête les jointures sur auteur et collection sont absentes.

    De fait voilà LA requête qui me retourne le livre sélectionné (donc présent dans DETAIL_QMU pour les critères prévus)


    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    SELECT DISTINCT
            ED.LIBELLE_EDITEUR,
            MU.TITRE,
            co.libelle_collection,
            ISNULL(au.identite,' ') as titre,
            MU.ANNEE_PUBLICATION_1,
            CONVERT(VARCHAR(4),MU.ID_MANUEL_EN_USAGE) AS IDMU,
            CONVERT(VARCHAR(4),MU.ID_MANUEL_EN_USAGE) as IDMU2,
            DQMU.ANNEE_ADOPTION,
            mu.tri_titre
    FROM
           ENSEIGNEMENT_MANUEL EM,
           EDITEUR ED,
           collection co,
           auteur au,
           MANUEL_EN_USAGE MU
              inner join DETAIL_QMU DQMU    ON DQMU.ID_MANUEL_EN_USAGE = MU.ID_MANUEL_EN_USAGE
              INNER JOIN DEFINIR_NIVEAU NIV on DQMU.ID_MANUEL_EN_USAGE = niv.ID_MANUEL_EN_USAGE
              Inner join REF_CLASSE ref     On REF.ID_CLASSE=niv.ID_CLASSE
     
    WHERE DQMU.ID_QUESTIONNAIRE = 20721  AND
    mu.id_collection  = co.id_collection AND  
    au.id_manuel_en_usage = mu.id_manuel_en_usage AND 
    ED.ID_EDITEUR = MU.ID_EDITEUR AND 
    MU.ID_MANUEL_EN_USAGE = EM.ID_MANUEL_EN_USAGE AND 
    EM.ID_DIS = 10  AND 
    MU.CODE_OBSOLETE = 0 AND 
    REF.ID_NIVEAU = 206 AND 
    REF.ID_CLASSE=niv.ID_CLASSE  AND 
    MU.ID_MANUEL_EN_USAGE = niv.ID_MANUEL_EN_USAGE
    AND REF.id_classe IN (27)

    A partir de là je veux obtenir l'ajout à cette liste de ceux qui pour les mêmes critères n'apparaissent pas dans DETAIL_QMU...

    Merci de votre aide si précieuse!

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 37
    Points : 37
    Points
    37
    Par défaut
    Finalement j'ai résolu mon problème grâce à vos conseils:

    - En imbriquant la requete de départ me donnant les livres cochés à celle ci:

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    SELECT DISTINCT ED.LIBELLE_EDITEUR, 
    MU.TITRE, co.libelle_collection,  
    ISNULL(au.identite,' ') as titre, 
    MU.ANNEE_PUBLICATION_1, 
    CONVERT(VARCHAR(4),MU.ID_MANUEL_EN_USAGE) AS IDMU,null as IDMU2, 
    NULL As ANNEE_ADOPTION ,  
    mu.tri_titre 
    FROM 
    ENSEIGNEMENT_MANUEL EM, EDITEUR ED, 
    collection co, 
    auteur au,  
    MANUEL_EN_USAGE MU  
    	INNER JOIN DEFINIR_NIVEAU NIV on MU.ID_MANUEL_EN_USAGE = niv.ID_MANUEL_EN_USAGE  
    	Inner join REF_CLASSE ref On REF.ID_CLASSE=niv.ID_CLASSE  
    WHERE   
    mu.id_collection  = co.id_collection AND   
    au.id_manuel_en_usage = mu.id_manuel_en_usage AND 
    ED.ID_EDITEUR = MU.ID_EDITEUR AND  
    MU.ID_MANUEL_EN_USAGE = EM.ID_MANUEL_EN_USAGE AND 
    EM.ID_DIS = 204 AND  
    MU.CODE_OBSOLETE = 0 AND 
    REF.ID_NIVEAU = 200 AND 
    REF.ID_CLASSE=niv.ID_CLASSE  AND  
    MU.ID_MANUEL_EN_USAGE = niv.ID_MANUEL_EN_USAGE  AND 
    REF.id_classe IN (33)  AND 
    Mu.id_manuel_en_usage not in 
    	(select 
    	dqmu.id_manuel_en_usage 
    	from 	detail_qmu dqmu 
    	where DQMU.ID_QUESTIONNAIRE = 20237)
    Donc j'ai réduit l'union pour exclure les infos de DQMU et ajouté comme rejet toute donnée présente dans le questionnaire (id_questionnaire).

    Merci à tous de ce coup de main précieux.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/05/2008, 11h48
  2. [SQL Server 2000] requête avec le nom de la table dynamique
    Par insane_80 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 07/12/2006, 17h57
  3. Requête sur Vue SQL Server 2000 PLANTE aléatoirement
    Par StarMusic dans le forum Bases de données
    Réponses: 1
    Dernier message: 07/11/2006, 10h22
  4. [SQL-SERVER 2000] Problème de requête sur une seule ligne
    Par Sytchev3 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 05/04/2006, 16h54
  5. Requêtes analyses croisées sous SQL Server 2000
    Par callo dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/09/2005, 19h27

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