Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/02/2012, 09h27   #1
Candidat au titre de Membre du Club
 
Inscription : février 2011
Messages : 70
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 70
Points : 13
Points : 13
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 !
weebo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 10h23   #2
Membre Expert
 
Inscription : août 2009
Messages : 779
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 779
Points : 1 098
Points : 1 098
Après une réponse à côté (supprimée), voilà deux possibilités :

Code :
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 :
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)
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 10h30   #3
Candidat au titre de Membre du Club
 
Inscription : février 2011
Messages : 70
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 70
Points : 13
Points : 13
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 !
weebo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 10h37   #4
Candidat au titre de Membre du Club
 
Inscription : février 2011
Messages : 70
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 70
Points : 13
Points : 13
En passant par une table temporaire j'arrive à mon résultat mais je ne sais pas si celle-ci est vraiment optimisée !

Code :
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
weebo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 12h14   #5
Membre Expert
 
Inscription : août 2009
Messages : 779
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 779
Points : 1 098
Points : 1 098
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
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h48.


 
 
 
 
Partenaires

Hébergement Web