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] SELECT + EXCEPT


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 32
    Par défaut [SQL] SELECT + EXCEPT
    Bonjour,

    j'aimerai voir tous les objects d'une table a l'exception de ceux contenus dans une autre. J'aimerai faire cela en une seule requete mais j'ai qq soucis.

    Table de relation : defini des restrictions
    TABLE_1(ID_USER, ID_COMP)

    Table des utilisateurs :
    TABLE_2(ID_USER, name, ....)

    j'aimerai donc selectionner tous les utilisateurs presents dans TABLE_2 a l'exception de ceux se trouvant dans TABLE_1 pour ID_COMP=xxx

    d'avance merci
    Mike

  2. #2
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Par défaut
    Salut

    Essaie ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select name from table1,table2 where table2.id_user not in (select id_user from table1 where id_comp =xxx);

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    j'aimerai voir tous les objects d'une table ...
    fais attention ce terme n'a surement la signification que tu souhaites, tu dois probablement parler de lignes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T2.ID_USER, T2.name
    FROM TABLE_2 AS T2
    INNER JOIN TABLE_1 AS T1 ON (T1.ID_USER = T2.ID_USER)
    WHERE T1.ID_COMP <> 'xxx';

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Grillé par Cybher mais il me semble que tu as commis une erreur : il n'y a pas besoin de table1 dans la clause FROM de la requête principale, non ?

    D'autre part, Mike@Nestor comme tu n'as pas respecté les règles du forum et indiqué ton SGBD cette solution ne fonctionnera pas s'il ne supporte pas les sous-requêtes (ex : MySQL avec la version < 4.1)

  5. #5
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 32
    Par défaut
    Quelle activité !! merci pour vos réponses aussi rapides !

    désolé pour ne pas avoir mentionné mon SGBD, mais la base de données n'est pas ma spécialité et je pensais que les requètes de la sorte pouvaient être interpretees dans tous les SGBD.

    Je n'ai pas encore vraiment de SGBD fixe, mais je pense a PostGreSQL

    (au fait oui je parlais bien de lignes pour les objets)

    merci bcp j'essaie tout ca...
    Mike

  6. #6
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Par défaut
    Magnus>> C'est pas plutôt cela que tu voulais dire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T2.ID_USER, T2.name
    FROM TABLE_2 AS T2 LEFT OUTER JOIN TABLE_1 AS T1 ON (T2.ID_USER = T1.ID_USER)
    WHERE T1.ID_COMP IS NULL;

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Médiat : euh... non si je relis le post de Mike@Nestor et que l'on comprend la phrase suivante de la même manière alors je pense avoir la solution mais pas toi :
    j'aimerai donc selectionner tous les utilisateurs presents dans TABLE_2 a l'exception de ceux se trouvant dans TABLE_1 pour ID_COMP=xxx
    En tout cas de ce que je comprends l'exclusion des lignes est effectuée lorsque Table_1.ID_COMP = 'xxx'

    Si tu ne vois pas les choses comme moi et restes sur ta position merci de m'éclairer parce que le Français me pose parfois des problèmes d'interprétation (je pense que depuis quelques semaines tu t'es en rendu quand tu me corrigeais )

  8. #8
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Par défaut
    j'aimerai donc selectionner tous les utilisateurs presents dans TABLE_2 a l'exception de ceux se trouvant dans TABLE_1 pour ID_COMP=xxx
    J'avais compris :

    (Eléments de Table_2 pour ID_COMP ='xxx') - (Eléments de Table_1)
    et non
    (Eléments de Table_2) - (Eléments de Table_1 pour ID_COMP ='xxx')

    A la relecture, je pense que tu as raison.

    D'autant plus que j'ai zappé le AND T2.ID_COMP = 'xxx'.

  9. #9
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 32
    Par défaut
    Je viens de tester et tout fonctionne avec la requête de Cybher.
    Je n'ai pas testé la requête de Magnus car je n'y comprend pas tout

    a la base j'avais essayé la requete suivante mais elle ne fonctionnait pas car j'avais une erreur dans mes donnees de tables :

    SELECT * FROM TABLE_2 WHERE NOT EXISTS (SELECT id_user FROM TABLE_1 WHERE id_comp=xxx and TABLE_2.id_user=TABLE_1.id_user)

    pour terminer je vais utiliser la requete de cybher qui est bien plus simple
    merci a vous tous

    Mike

  10. #10
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Je n'ai pas testé la requête de Magnus car je n'y comprend pas tout
    tu as la solution à ton problème et tu ne vas pas te compliquer la vie à comprendre la signification de LEFT JOIN, etc. ce que je peux comprendre.

    Cependant, il est fort probable qu'un jour ou l'autre tu aies besoin de faire une jointure externe et là tu te diras "oui je me rappelle d'un gars qui avait proposé une solution de dingue..." et tu regretteras de ne pas avoir cherché +loin d'autant que je t'aide encore un peu : voici une explication sur les jointures externes 8)

  11. #11
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Par défaut
    c'est vrai qu'une jointure sa résolura beaucoup plus de problème.

    je te conseille d'essayer de comprendre

  12. #12
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 32
    Par défaut
    pourquoi ? de quels problèmes tu veux parler ?
    tu veux dire que tous les sgbd ne comprennent pas les sous requetes alors qu'ils comprennent les jointures ?

    et en qualité de performance, quelle est la meilleure solution ?

    merci
    Mike

  13. #13
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    MySQL ne supporte pas les sous-requêtes avant la version 4.1 par exemple et ce que l'on te conseille d'une manière générale c'est de connaître plusieurs manières de faire le même traitement.

    Concernant les performances, je ne peux pas me prononcer mais les articles de SQLpro devraient t'en dire plus et alors tu me pourras me dire entre une jointure externet et une sous-requête qui est le plus performant ?

  14. #14
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 32
    Par défaut
    dacodac, je n'ai donc pas d'autre choix que de me plonger dans les abisses des jointures sql

    merci
    Mike

  15. #15
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 32
    Par défaut
    Bonjour,

    j'ai essayé les requêtes avec jointures mais tjrs qq soucis ...
    La requete de Magnus fonctionne mais seulement si la table T1 n'est pas vide !
    La requete de Médiat ne fonctionne pas.

    so what's the problem ?

    Autre question :
    ma table 2 comporte les champs login et pass

    Je veux recuperer, dans T2, l'utilisateur ayant les login et pass (x1 et x2) mais seulement si son id (id_user) ne figure pas dans T1 pour id_comp='xxx'

    je n'arrive pas à ecrire la requete....
    merci pour votre aide

    Mike

  16. #16
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    La requete de Magnus fonctionne mais seulement si la table T1 n'est pas vide !
    Si j'ai bien compris tes explications, je te propose donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T2.LOGIN, T2.PASS
    FROM TABLE_2 AS T2 
    LEFT JOIN TABLE_1 AS T1 ON (T1.ID_USER = T2.ID_USER AND T1.ID_COMP <> 'xxx');
    Si cette requête s'exécute mais qu'elle ne fait pas ce que tu veux alors :
    - indiques le schéma de tes tables avec les noms réels au lieu de Table1, etc.
    - décrits une fois pour toute ce que tu souhaites que la requête si ce n'est pas exactement ce que l'on a compris.

  17. #17
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 32
    Par défaut
    Merci Magnus pour ton aide.

    Je n'ai pas exactement ce que je veux. En fait j'ai exactement ce que je veux en utilisant des sous requetes, mais bon j'aimerai qd meme bien savoir faire (et comprendre) la meme chose en utilisant les jointures.

    Je reexplique mon souhait :
    T2 (id_user, login, pass)
    T1 (id_user, id_comp)

    Je veux récupérer tous les utilisateurs contenu dans la table T2 (tous leurs champs, pas seulement login et pass) excepté ceux dont l'identifiant (id_user) apparait dans T1 pour id_comp='xxx'.
    La table T2 stocke des utilisateurs, la table T1 stocke des restrictions d'acces au composants identifiés par id_comp.

    Par ex:
    T2: (id_user, login, pass)
    1, admin, admin
    2, toto, toto
    3, titi, titi

    T1: (id_user, id_comp)
    2, 3
    3, 3
    2, 4

    => L'utilisateur toto n'a ni acces au composant 3 ni acces au composant 4
    => L'utilisateur titi n'a pas acces au composant 3

    Requete 1 : recuperation des utilisateurs ayant acces au composant identifié par id_comp=3
    - 1, admin, admin

    Requete 2 : recuperation des utilisateurs ayant acces au composant identifié par id_comp=4
    - 1, admin, admin
    - 3, titi, titi

    Requete 3 : recuperation des utilisateurs ayant acces au composant identifié par id_comp=5
    - 1, admin, admin
    - 2, toto, toto
    - 3, titi, titi


    Magnus, ta derniere correction :
    SELECT * FROM T2 LEFT JOIN T1 ON (T1.id_user = T2.id_user AND T1.id_comp<>'xxx');

    fonctionne presque : elle ne me renvoie jamais l'identifiant de l'utilisateur

    Mike

  18. #18
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Ok maintenant tout est clair.

    Pour moi tu ne peux pas faire ce traitement avec une jointure sans passer par une clause (NOT) IN, (NOT) EXISTS, etc.

    Ex : je reprends ton exemple pour le composant 3
    => si tu ne fais qu'une jointure sans clause IN ou EXISTS alors quand tu relies l'utilisateur (2, toto) à l'enregistrement (2, 4) de T1 tu ne peux pas savoir qu'il existe dans cette table un enregistrement (2, 3) associé à cette entrée de T2

    Pour moi (les autres me contrediront peut être ?) pas la pein de creuser plus loin : la solution de Cybher fonctionne et tu ne peux pas faire le même traitement SEULEMENT avec une(des) jointure(s).

  19. #19
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 32
    Par défaut
    ok, merci beaucoup
    il y avait un truc que je n'arrivais pas a saisir avec les jointures, et ct justement ce probleme d'exclusion

    ca me rassure, donc tout fonctionne pour moi c nikel
    encore un grand merci !!

    Mike

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

Discussions similaires

  1. [SQL] select champ 5-ème caractère = "D"
    Par mlequim dans le forum Langage SQL
    Réponses: 5
    Dernier message: 05/09/2005, 17h15
  2. [SQL] select en JAVA
    Par webbulls dans le forum JDBC
    Réponses: 2
    Dernier message: 09/06/2005, 14h08
  3. [SQL] selection des dates en ne distinguant pas l'heure
    Par meufeu dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/06/2005, 11h29
  4. [SQL] select syntaxe
    Par Leila75 dans le forum Oracle
    Réponses: 3
    Dernier message: 10/05/2005, 11h05
  5. SQL :select et AND
    Par Shabata dans le forum Langage SQL
    Réponses: 5
    Dernier message: 20/05/2003, 13h39

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