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 :

Probleme de jointure


Sujet :

Langage SQL

  1. #1
    Membre averti Avatar de guy2004
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    805
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 805
    Points : 377
    Points
    377
    Par défaut Probleme de jointure
    Bonjour,
    j'ai un soucis que je n'arrive pas à résoudre (j'ai cherché mais en vain..)
    J'ai une table de produits, de produits_description et une pour les produits en promos.
    Je cherche a lister tous les produits qui ne sont PAS en promos.

    La requete pour les produits en promos est bonne je cherche l'inverse, la voici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT * 
    FROM produits, prd_description, specials
     
    WHERE produits.prd_id LIKE specials.products_id
     
    AND produits.prd_id = prd_description.prd_id
     
    AND now( ) <= expires_date
     
    AND expires_date >0
     
    ORDER BY produits.prd_id DESC
    Je voudrai que les id des produits en promos soient exclus.

  2. #2
    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
    En gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT pro.*, prd.*
      FROM produits pro
           INNER JOIN prd_description prd
             ON prd.prd_id = pro.prd_id
     WHERE NOT EXISTS (select null from specials spe
                       WHERE spe.products_id = pro.prd_id)
    Je ne sais pas à quelle table appartient la colonne expires_date, donc à rajouter.

  3. #3
    Membre averti Avatar de guy2004
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    805
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 805
    Points : 377
    Points
    377
    Par défaut
    Cela me donne cette erreur:
    requête SQL:

    SELECT qa_motos_pro . * , qa_motos_prd . *
    FROM qa_motos_produits pro
    INNER JOIN qa_motos_prd_description prd ON prd.prd_id = pro.prd_id
    WHERE NOT
    EXISTS (


    SELECT NULL
    FROM qa_motos_specials spe
    WHERE spe.products_id = pro.prd_id
    )
    LIMIT 0 , 30

    MySQL a répondu:

    #1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'EXISTS (SELECT NULL FROM qa_motos_specials spe

  4. #4
    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
    Quelle est votre version de MySQL ?

  5. #5
    Membre averti Avatar de guy2004
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    805
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 805
    Points : 377
    Points
    377
    Par défaut
    La version est: MySQL: 5.0.51a

  6. #6
    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
    Bizarre... Peut-être à cause des espaces / alias de table ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT pro.*, prd.*
      FROM qa_motos_produits as pro
           INNER JOIN qa_motos_prd_description as prd
             ON prd.prd_id = pro.prd_id
     WHERE NOT EXISTS (SELECT NULL 
                         FROM qa_motos_specials as spe
                        WHERE spe.products_id = pro.prd_id)
    LIMIT 0, 30

  7. #7
    Membre averti Avatar de guy2004
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    805
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 805
    Points : 377
    Points
    377
    Par défaut
    Meme erreur:
    Erreur
    requête SQL:

    SELECT pro . * , prd . *
    FROM qa_motos_produits AS pro
    INNER JOIN qa_motos_prd_description AS prd ON prd.prd_id = pro.prd_id
    WHERE NOT
    EXISTS (


    SELECT NULL
    FROM qa_motos_specials AS spe
    WHERE spe.products_id = pro.prd_id
    )
    LIMIT 0 , 30

    MySQL a répondu:

    #1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'EXISTS (SELECT NULL
    FROM qa_motos_specia

  8. #8
    Membre averti Avatar de guy2004
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    805
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 805
    Points : 377
    Points
    377
    Par défaut
    C'est une question de version puisque sur mon serveur local cela fonctionne effectivement.

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 244
    Points : 12 878
    Points
    12 878
    Par défaut
    Bonjour,
    On peut aussi passer par une jointure directe:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT * 
    FROM produits
    inner join prd_description on produits.prd_id = prd_description.prd_id
    left outer join specials on produits.prd_id LIKE specials.products_id and now( ) <= expires_date and expires_date >0
     
    WHERE special.products_id is null
     
    ORDER BY produits.prd_id DESC

    Tatayo.

    P.S. j'ai copié les conditions de jointure telles quelles, mais pouquoi un like entre les tables PRODUITS et SPECIAL ?

  10. #10
    Membre averti Avatar de guy2004
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    805
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 805
    Points : 377
    Points
    377
    Par défaut
    Bonjour tatayoyo,
    Cela marche merci beaucoup,
    le like est a l'origine un = pour faire une jointure entre specials et produits.

  11. #11
    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
    Il faut ajouter un DISTINCT à la requête si vous utilisez une jointure externe.

  12. #12
    Membre averti Avatar de guy2004
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    805
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 805
    Points : 377
    Points
    377
    Par défaut
    J'ai pas compris waldar, cela ferait quoi et pourquoi svp ?

  13. #13
    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
    Requête exists (c'est de l'Oracle) :
    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
    With Produit AS
    (
    select 1 as id_prd, 'Produit 1' as name from dual
    )
      ,  Promo AS
    (
    select 1 as id_prm, 1 as id_prd from dual union all
    select 2          , 1           from dual
    )
    select prd.*
      from Produit prd
     where exists (select null from Promo prm
                   where prm.id_prd = prd.id_prd);
     
    ID_PRD	NAME
    1	Produit 1
    Requête outer join :
    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
    With Produit AS
    (
    select 1 as id_prd, 'Produit 1' as name from dual
    )
      ,  Promo AS
    (
    select 1 as id_prm, 1 as id_prd from dual union all
    select 2          , 1           from dual
    )
    select prd.*
      from Produit prd
           left outer join Promo prm
             on prm.id_prd = prd.id_prd;
     
    ID_PRD	NAME
    1	Produit 1
    1	Produit 1

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 244
    Points : 12 878
    Points
    12 878
    Par défaut
    Je suis étonné par le résultat.
    Si je lance cette requête sur ma base (Maxdb);
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select article.*
    from article
    left outer join prix on prix.art_c_ref = article.art_c_ref and prix.trf_c_code = 'V02' and prix.ep_c_code <> 'PB'
    where article.art_c_ref like '01000%' and prix.art_c_ref is null

    Avec ou sans distinct, j'obtiens le même résultat.
    Je note d'ailleurs que dans ton deuxième exemple il manque la clause prm.idproduit is null dans le where.
    Quel est le résultat avec ceci:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    WITH Produit AS
    (
    SELECT 1 AS id_prd, 'Produit 1' AS name FROM dual
    )
      ,  Promo AS
    (
    SELECT 1 AS id_prm, 3 AS id_prd FROM dual union ALL
    SELECT 2          , 4           FROM dual
    )
    SELECT prd.*
      FROM Produit prd
           LEFT OUTER JOIN Promo prm
             ON prm.id_prd = prd.id_prd;
    where prm.id_prm is null

    Le but à l'origine était de trouver les produits qui NE SONT PAS en promo, donc ceux pour lesquels la jointure n'est pas satisfaite.

    Tatayo.

  15. #15
    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
    Au temps pour moi, j'avais transformé le NOT EXISTS en EXISTS au fur et à mesure du sujet.

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

Discussions similaires

  1. Probleme en jointure
    Par angelayoub dans le forum Langage SQL
    Réponses: 1
    Dernier message: 09/01/2006, 15h07
  2. [MySQL] probleme de jointure entre 2 tables
    Par guy2004 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 30/10/2005, 14h11
  3. Probleme de jointure externe ...
    Par amenis dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 06/09/2005, 09h59
  4. Probleme de Jointures imbriquées dans une requête
    Par Crevin dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/04/2005, 11h05
  5. PROBLEME DE JOINTURE ENTRE DEUX TABLE
    Par DarkMax dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/01/2005, 15h11

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