2010-06-16 80 views
1

我有兩個表 發佈者和廣告系列都與國家,地區,語言和類別具有類似的多對多關係。TSQL,從大多對多關係中選擇值

更多信息

Publisher2Categories具有的publisherId和的categoryID這是外鍵的publisherId在出版商和的categoryID在分類這是標識列。另一方面,我有Campaigns2Categories,其中有campaignID和categoryID列,它們是Campaigns中的campaignID和category中的categoryID中的外鍵,這兩個標識又是標識。 同去的地區,語言和國家的關係

我如何獲得具有至少一個等於出版商(我通過查詢的publisherId)的地區,國家,語言或類別值的廣告活動campaignIDs?

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

click here for direct link

感謝

+1

有什麼問題嗎? – 2010-06-16 09:17:43

+0

@ Marcelo Cantos,突出了問題 – eugeneK 2010-06-16 09:33:30

回答

1

JOINING出版商和廣告活動UNION每一個人多對多表中的結果應該讓你與所有CAMPAIGNID的有出版商和campains之間的匹配通過一個有各自的關係表。

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。如果CampaignID必須存在於所有四個表中,請使用INTERSECT而不是UNION – 2010-06-16 10:07:25

+0

謝謝。最後你得到了我的答案。我將檢查其他答案的性能與您的數據,並決定哪一個更快地執行我的數據。 再次感謝 – eugeneK 2010-06-16 10:41:42

+0

*終於你得到了我的答案?*這就像*你給過的所有其他答案都是毫無價值的*。 (爲了記錄,我確實認爲這不是你的意思;) – 2010-06-16 11:47:15

0

你可能想找到鏈接廣告活動和出版商一個連接式的時間,和工會的結果:

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

謝謝,我會比較這個查詢與我的數據庫的性能與其他答案,看看有什麼更好地執行 – eugeneK 2010-06-16 11:07:13