2010-06-16 5 views
1

J'ai deux tables Publishers et Campaigns, les deux ont des relations many-to-many similaires avec les pays, les régions, les langues et les catégories.TSQL, sélectionner des valeurs d'une relation plusieurs-à-plusieurs

Plus d'infos

Publisher2Categories a publisherID et categoryID qui sont les clés étrangères à publisherID dans les éditeurs et les categoryID dans les catégories qui sont des colonnes d'identité. D'un autre côté, j'ai Campaigns2Categories avec des colonnes campaignID et categoryID qui sont des clés étrangères à campaignID dans Campaigns et categoryID dans des catégories qui sont à nouveau des identités. va de même pour les régions, les langues et les relations pays

Comment puis-je obtenir campaignIDs des campagnes qui ont au moins un égal à l'éditeur (je passe à interroger publisherID) la valeur des régions, des pays, la langue ou les catégories?

DB DIAGRAM http://img227.imageshack.us/img227/7264/64255522.png

click here for direct link

grâce

+1

Quelle est la question? –

+0

@Marcelo Cantos, a mis en évidence la question – eugeneK

Répondre

1

JOINING chaque table de ManyToMany des éditeurs et des campagnes et UNION le résultat devrait vous laisser avec tous les années campaignid qui ont une correspondance entre les éditeurs et campains par l'un des il y a des tables de relations respectives.

SELECT cc.CampaignID 
FROM dbo.PublisherSites2Countries pc 
     INNER JOIN dbo.Campaings2Countries cc ON cc.CountryID = pc.CountryID 
UNION SELECT pr.CampaignID 
FROM dbo.PublisherSites2Regions pr 
     INNER JOIN dbo.Campaings2Regions cr ON cr.RegionID = pr.RegionID 
... 
+0

+1. Si le CampaignID doit exister dans les quatre tables, utilisez INTERSECT au lieu de UNION –

+0

merci. Enfin, vous avez une réponse pour moi. Je vais vérifier les performances d'autres réponses par rapport à votre et décider lequel exécute plus rapidement avec mes données. Merci encore – eugeneK

+0

* enfin vous avez réponse pour moi? * Cela se lit comme * toutes les autres réponses que vous avez jamais donné ne valent rien *. (Pour mémoire, je suppose que ce n'est pas ce que vous vouliez dire;) –

0

Vous voulez sans doute trouver liées campagnes et éditeurs un join-type à la fois, et l'union des résultats:

SELECT DISTINCT campaignID 
    FROM Campaigns2Countries c2cy 
WHERE EXISTS (SELECT * FROM PublisherSites2Countries 
       WHERE countryID = c2cy.countryID 
        AND publisherID = :publisherID) 
UNION 
SELECT DISTINCT campaignID 
    FROM Campaigns2Categories c2cat 
WHERE EXISTS (SELECT * FROM PublisherSites2Categories 
       WHERE categoryID = c2cat.categoryID 
        AND publisherID = :publisherID) 
UNION 
... 
+0

merci, je vais comparer les performances de cette requête contre mon db avec d'autres réponses pour voir ce qui fonctionne mieux – eugeneK

Questions connexes