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

Développement SQL Server Discussion :

[SQL] Intersection multiples


Sujet :

Développement SQL Server

  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Novembre 2006
    Messages : 131
    Par défaut [SQL] Intersection multiples
    Bonjour,

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 999
    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 999
    Billets dans le blog
    6
    Par défaut
    Quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    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/ * * * * *

  4. #4
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Novembre 2006
    Messages : 131
    Par défaut
    Solution retenue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

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

Discussions similaires

  1. [SQL] Intersection entre deux tables
    Par Al3x dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 27/12/2007, 16h46
  2. [SQL] Recherche multiple Régions
    Par dcheira dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 04/10/2007, 15h23
  3. [SQL] Insertion multiple dans base de donnée
    Par leroidje dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 03/08/2007, 13h24
  4. Expression SQL " INTERSECT "
    Par issam16 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 20/10/2006, 11h17
  5. [PostGre SQL] Jointure multiples impossible
    Par Montaigne dans le forum Langage SQL
    Réponses: 8
    Dernier message: 27/04/2006, 10h20

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