Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
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 15/06/2011, 17h58   #1
Membre du Club
 
Inscription : novembre 2006
Messages : 131
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : novembre 2006
Messages : 131
Points : 51
Points : 51
Par défaut [SQL] Intersection multiples

Bonjour,

Dans mon problème, j'ai la table suivante :

Code :
1
2
3
4
5
6
7
8
9
 
CREATE TABLE [dbo].[CategoryAsset]
(
	CategoryId int NOT NULL, 
	AssetId int NOT NULL
)
ALTER TABLE [dbo].[CategoryAsset]
	ADD CONSTRAINT [PK_CategoryAsset]
	PRIMARY KEY (CategoryId, AssetId)
Si je veux obtenir la liste des AssetId correspondant à une Catégorie donnée je procède ainsi :
Code :
1
2
3
4
5
6
 
DECLARE @Category int;
SET @Category = 20000;
SELECT DISTINCT ca.AssetId
FROM CategoryAsset ca
WHERE ca.CategoryId=@Category;
Maintenant je souhaite avoir la liste des AssetId correspondant à plusieurs Catégories :
Code :
1
2
3
4
5
 
DECLARE @Categories TABLE(Id int);
INSERT INTO @Categories(Id) VALUES(20000);
INSERT INTO @Categories(Id) VALUES(860000);
SELECT ???????????????????????????
C'est ici que je bloque. J'ai besoin de faire une requête select qui me donne l'intersection des AssetId ayant les categoryId contenus dans ma variable @Categories...

En bref, le résultat que je souhaite obtenir est l'équivalent de :
Code :
1
2
3
4
5
6
7
8
 
SELECT DISTINCT ca.AssetId
FROM CategoryAsset ca
WHERE ca.CategoryId=20000
INTERSECT
SELECT DISTINCT ca.AssetId
FROM CategoryAsset ca
WHERE ca.CategoryId=860000
Sachant que je ne souhaite pas faire de la génération de code sql.

Merci
jowsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 18h13   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

Vous pouvez chercher les AssetId dont :
1/ CategoryId = 20000
2/ il existe un eligne ayant le meme AssetId et dont la categoryId = 860000

Soit, en SQL :
Code SQL :
1
2
3
4
5
6
7
8
9
10
 
SELECT DISTINCT ca.AssetId
FROM CategoryAsset ca
WHERE ca.CategoryId=20000
    AND EXISTS(
        SELECT *
        FROM CategoryAsset ca2
        WHERE ca.AssetId = ca2.AssetID
            AND ca2.CategoryId = 860000
    )

ou avec une auto-jointure :

Code SQL :
1
2
3
4
5
6
7
 
SELECT DISTINCT ca.AssetId
FROM CategoryAsset ca
INNER JOIN CategoryAsset ca2
    ON ca.AssetId = ca2.AssetID
    AND ca2.CategoryId = 860000
WHERE ca.CategoryId=20000
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 18h13   #3
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 954
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 954
Points : 17 774
Points : 17 774
Quelque chose comme :
Code :
1
2
3
4
5
6
7
 
SELECT ca.AssetId
FROM   CategoryAsset ca
WHERE  ca.CategoryId= IN (SELECT IF FROM Category)
GROUP  BY ca.AssetId
HAVING COUNT(DISTINCT ca.CategoryId) = (SELECT COUNT(DISTINCT ID) 
                                        FROM   @Category)
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 18h35   #4
Membre du Club
 
Inscription : novembre 2006
Messages : 131
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : novembre 2006
Messages : 131
Points : 51
Points : 51
Solution retenue :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
DECLARE @Categories TABLE(Id int);
INSERT INTO @Categories(Id) VALUES(20000);
INSERT INTO @Categories(Id) VALUES(860000);
INSERT INTO @Categories(Id) VALUES(4810000);
 
SELECT ca.AssetId
FROM   CategoryAsset ca
WHERE  ca.CategoryId IN (SELECT Id FROM @Categories)
GROUP  BY ca.AssetId
HAVING COUNT(DISTINCT ca.CategoryId) = (SELECT COUNT(DISTINCT ID) 
                                        FROM   @Categories)
Merci pour vos réponses toujours aussi rapides et efficaces
jowsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h21.


 
 
 
 
Partenaires

Hébergement Web