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 :

Aide pour requête SQL assez simple


Sujet :

Langage SQL

  1. #1
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut Aide pour requête SQL assez simple
    Bonjour,

    j'ai besoin d'aide pour une requête toute simple, mais que je n'arrive pas à la réaliser:

    J'ai 3 tables:

    Client (CliId, CliNom, ParamId)
    Parametre (ParamId, Param1, Param2)
    Produit (PdtId, PdtRef, ParamId)

    J'aimerais sélectionner les clients qui n'ont pas de paramètres associés aux produits.
    J'ai commencé par écrire:
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select Cli.*
    from Client Cli
       inner join Parametre Param
           on Cli.ParamId = Param.ParamId
    mais cette requête donne tous les clients, même ceux qui ont des paramètres associés aux produits.

    Merci d'avance.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    votre table n'étant pas normalisé (Param1, Param2) il est impossible de savoir ce que vous voulez...

    Commencez soit par normaliser votre base, soit par décrire le contenu détaille de vos tables.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 40
    Points : 36
    Points
    36
    Par défaut
    Bonjour.

    Ta requête retourne les clients qui ont des paramètres associés aux produits et non pas ce que tu cherches à faire. Je pourrai l'écrire comme suit:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select Cli.*
    from Client Cli
       where Cli.ParamId not in (select Param.ParamId from Parametre Param)
    Bon courage.

  4. #4
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    Bonjour,

    Commencez soit par normaliser votre base, soit par décrire le contenu détaille de vos tables.
    Oui désolé, c'est parce qu'il y a plusieurs paramètres et je m'était dit que ce n'était pas forcément nécessaire de les mettre. En fait les paramètres sont des paramètres de stockage dans des tours réfrigérés. Chaque produit est associé à une série de paramètres. Et d'ailleurs je me suis trompé dans ma description, ce n'est pas les clients qui sont associés aux paramètres mais des équipements. Chaque équipement est associé à une série de paramètre. Et même si ce n'est plus important dans ma requête mais chaque produit appartient à un client donc on a:

    Equipement (EqptId, EqptNom, CategorieId, RoleId, ParamId)
    Parametre (ParamId, ParamTempSouffl, ParamTempEvac, ParamTxCO)
    Produit (PdtId, PdtRef, ParamId, ClientId)
    Client(ClientId, ClientNom)

    J'aimerais avoir la liste des équipements associés à des paramètres qui ne sont associés à aucun produit.
    J'espère que ça va aller pour m'aider, je n'ai pas mis la liste de tous les paramètres car il y en a vraiment beaucoup.

    Merci d'avance pour votre aide.

  5. #5
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    et le NOT IN proposé au dessus????
    Ils ne savaient pas que c'était impossible alors ils l'ont fait (Mark Twain)
    _ _ _ _ _ _ _ _ _

    La planète ne nous appartient pas, elle nous a été prêtée par nos enfants
    _ _ _ _ _ _ _ _ _

    Technos : Access, C++ Builder, SQL, PostgreSQL, Crystal Reports, XML entre autres

  6. #6
    Membre expérimenté Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Points : 1 734
    Points
    1 734
    Par défaut
    Plus performant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Cli.* FROM Client Cli 
    WHERE NOT EXISTS 
     (SELECT 1 FROM Parametre Param 
     WHERE Cli.ParamId = Param.ParamId)
    La théorie, c'est quand on sait tout mais que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

    Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/

  7. #7
    Membre confirmé Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Points : 565
    Points
    565
    Par défaut
    Citation Envoyé par scheu Voir le message
    Plus performant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Cli.* FROM Client Cli 
    WHERE NOT EXISTS 
     (SELECT 1 FROM Parametre Param 
     WHERE Cli.ParamId = Param.ParamId)
    ca devrait marcher aussi ca non ?( et perso j'ai constaté que c'etait toujours plus performant meme si je me l'explique pas )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select Cli.* FROM Client Cli , Parametre Param
    where Cli.ParamId =(+) Param.ParamId 
    and Param.ParamId is null
    C'est pas parce que ca marche que c'est bon!!
    Pensez au bouton "Résolu"
    Je ne réponds pas en privé aux questions

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    @miloux32 : attention, tu utilises ici une écriture spécifique à Oracle. L'équivalent normalisé est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Cli.* 
    FROM Client Cli 
      LEFT JOIN Parametre Param ON Cli.ParamId = Param.ParamId 
    WHERE Param.ParamId IS NULL
    C'est souvent plus performant, parce que dans la plupart des cas les jointures sont mieux optimisées que les sous-requêtes.
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  9. #9
    Membre confirmé Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Points : 565
    Points
    565
    Par défaut
    Citation Envoyé par Antoun Voir le message
    @miloux32 : attention, tu utilises ici une écriture spécifique à Oracle. L'équivalent normalisé est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Cli.* 
    FROM Client Cli 
      LEFT JOIN Parametre Param ON Cli.ParamId = Param.ParamId 
    WHERE Param.ParamId IS NULL
    C'est souvent plus performant, parce que dans la plupart des cas les jointures sont mieux optimisées que les sous-requêtes.
    oups merci pour la remarque ! c'est vrai que c'est spécif a oracle (mais bon c'est tellement plus beau en oracle ! )
    C'est pas parce que ca marche que c'est bon!!
    Pensez au bouton "Résolu"
    Je ne réponds pas en privé aux questions

  10. #10
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par miloux32 Voir le message
    (mais bon c'est tellement plus beau en oracle ! )
    Vade retro !
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  11. #11
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    Citation Envoyé par Antoun Voir le message
    Vade retro !
    +1!!!!*

    Citation Envoyé par Antoun Voir le message
    SELECT Cli.*
    FROM Client Cli
    LEFT JOIN Parametre Param ON Cli.ParamId = Param.ParamId
    WHERE Param.ParamId IS NULL
    j'avais jamais pensé à celle là...c'est bon ça!!!

    EDIT : punaise, en fait si...j'utilise cette syntaxe mais j'ai jamais pensé à la substituer au NOT IN
    Ils ne savaient pas que c'était impossible alors ils l'ont fait (Mark Twain)
    _ _ _ _ _ _ _ _ _

    La planète ne nous appartient pas, elle nous a été prêtée par nos enfants
    _ _ _ _ _ _ _ _ _

    Technos : Access, C++ Builder, SQL, PostgreSQL, Crystal Reports, XML entre autres

  12. #12
    Membre expérimenté Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Points : 1 734
    Points
    1 734
    Par défaut
    Citation Envoyé par miloux32 Voir le message
    c'est tellement plus beau en oracle !
    .. Sauf le jour où tu décides de migrer la base vers un autre SGBD et qu'il faut repasser sur toutes les requêtes non standard SQL de l'application
    La théorie, c'est quand on sait tout mais que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

    Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/

  13. #13
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par say Voir le message

    j'avais jamais pensé à celle là...c'est bon ça!!!

    EDIT : punaise, en fait si...j'utilise cette syntaxe mais j'ai jamais pensé à la substituer au NOT IN
    C'est l'avantage de commencer par Access. Comme il te manque tous les trucs balaises... tu apprends à faire sans !
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  14. #14
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    Citation Envoyé par Antoun Voir le message
    C'est l'avantage de commencer par Access. Comme il te manque tous les trucs balaises... tu apprends à faire sans !
    ben ouais...mais j'ai en effet commencer par Access ...et maintenant que tu le dis, c'est effectivement THE solution sous access .(qui connait qd même le Not IN)
    Ils ne savaient pas que c'était impossible alors ils l'ont fait (Mark Twain)
    _ _ _ _ _ _ _ _ _

    La planète ne nous appartient pas, elle nous a été prêtée par nos enfants
    _ _ _ _ _ _ _ _ _

    Technos : Access, C++ Builder, SQL, PostgreSQL, Crystal Reports, XML entre autres

  15. #15
    Membre confirmé Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Points : 565
    Points
    565
    Par défaut
    Citation Envoyé par scheu Voir le message
    .. Sauf le jour où tu décides de migrer la base vers un autre SGBD et qu'il faut repasser sur toutes les requêtes non standard SQL de l'application
    Je n'ai pas dit que les autres ne sont pas bien!
    Je trouve juste la notation d'Oracle plus esthétique (et puis bon mon taff , c'est de vendre du Oracle donc j'ai tres tres rarement à passer à autre chose!)
    C'est pas parce que ca marche que c'est bon!!
    Pensez au bouton "Résolu"
    Je ne réponds pas en privé aux questions

  16. #16
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    Bonjour,

    merci pour vos réponses, je réponds assez tardivement, je vais essayer ce que vous m'avez proposé.

    A bientôt

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

Discussions similaires

  1. [SQL] Demande d'aide pour requète SQL
    Par vinco888 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 30/01/2009, 20h04
  2. Aide pour requête SQL
    Par 0x0000091 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 07/01/2009, 15h50
  3. Aide pour requête SQL
    Par eatherquake dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/12/2008, 14h44
  4. Besoin d'aide pour requête SQL
    Par dinver78 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 21/05/2007, 18h20
  5. Besoin d'aide pour requête SQL
    Par vallica dans le forum Requêtes
    Réponses: 10
    Dernier message: 08/06/2006, 23h16

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