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

MS SQL Server Discussion :

Liste exclusive dans une table


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 87
    Par défaut Liste exclusive dans une table
    Bonjour,

    Je cherche à récupérer une liste de données dans une table et EXCLUSIVEMENT cette liste !

    Je m'explique :
    J'ai une table de liaison avec des données A et B. Je cherche à retrouver A en fonction d'une liste exclusive de B

    IdLiaison IdA IdB
    1 9 28
    2 9 29
    3 9 30
    4 9 31
    5 54 28
    6 54 29
    7 40 28
    8 68 28
    9 68 29
    10 68 42
    11 68 21
    12 68 38
    13 68 89

    Dans mon exemple, je cherche à récupérer les IdB (28, 29)
    Je veux donc exclusivement IdA = 54

    Quelqu'un a t il une idée ?

    Merci d'avance !

  2. #2
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Après une réponse à côté (supprimée), voilà deux possibilités :

    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
     
    WITH t AS
    ( SELECT 1 AS idA, 1 AS idB
      UNION ALL
      SELECT 1 AS idA, 2 AS idB
      UNION ALL
      SELECT 2 AS idA, 1 AS idB
      UNION ALL
      SELECT 3 AS idA, 1 AS idB
      UNION ALL
      SELECT 3 AS idA, 2 AS idB
      UNION ALL
      SELECT 3 AS idA, 3 AS idB
    )
     
    SELECT idA
    		  FROM t
    		 GROUP BY idA
     HAVING min (case when idB IN (1,2) then 1 else 0 end) = 1
        AND sum (case when idB IN (1,2) then 1 else 0 end) = 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT idA  
      FROM t
     WHERE idB in (1,2)
     GROUP BY idA
     HAVING count(*) = 2
    EXCEPT 
    SELECT idA  
      FROM t
     WHERE idB not in (1,2)

  3. #3
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 87
    Par défaut
    Merci,

    Mais j'ai du mal avec ta première requête !
    Si j'ai 50 valeurs dans ma liste, il va falloir faire 50 UNION
    Ça me parait bcp et je risque de cramer de la ressource ...

    La deuxième ma parait un peu mieux mais mérite d'être optimisée je pense, car les IN et NOT IN sont généralement gourmand surtout pour une liste conséquente !

  4. #4
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 87
    Par défaut
    En passant par une table temporaire j'arrive à mon résultat mais je ne sais pas si celle-ci est vraiment optimisée !

    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
     
    Declare @test table (IdB int);
     
    insert into @test
    (IdB)
    values
    (28 ),( 29 ),( 30 ),( 31 )
     
    select NbrA.IdA
    from (
    	select IdA
    	From Liaison
    	Group by IdA
    	having COUNT(IdB) = 4
    )as NbrA
    join Liaison L on L.IdA = NbrA.IdA
    join @test t on t.IdB = L.IdB
    Group by NbrA.IdA
    having COUNT( L.IdB) = 4

  5. #5
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Citation Envoyé par weebo Voir le message
    Merci,

    Mais j'ai du mal avec ta première requête !
    Si j'ai 50 valeurs dans ma liste, il va falloir faire 50 UNION
    Ça me parait bcp et je risque de cramer de la ressource ...

    La deuxième ma parait un peu mieux mais mérite d'être optimisée je pense, car les IN et NOT IN sont généralement gourmand surtout pour une liste conséquente !
    Le WITH, incluant les UNION ALL, n'est là que pour simuler ta table

Discussions similaires

  1. Listes déroulantes dans une table
    Par Emeline1989 dans le forum Access
    Réponses: 1
    Dernier message: 18/04/2011, 12h02
  2. [AC-2007] Deux zones de liste déroulante dans une table
    Par Junior75002 dans le forum Access
    Réponses: 3
    Dernier message: 04/01/2011, 00h56
  3. Réponses: 15
    Dernier message: 15/07/2009, 09h25
  4. [AC-2007] Liste déroulante dans une table
    Par sukkie dans le forum IHM
    Réponses: 6
    Dernier message: 27/04/2009, 19h38
  5. Liste déroulante dans une table hyperfile
    Par arnaud_verlaine dans le forum WinDev
    Réponses: 8
    Dernier message: 01/11/2006, 18h27

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