2010-03-27 148 views
-1

我有以下SQL:INNER JOIN返回的結果太多

SELECT * 
FROM [Database].dbo.[TagsPerItem] 
INNER JOIN [Database].dbo.[Tag] ON [Tag].Id = [TagsPerItem].TagId 
WHERE [Tag].Name IN ('home', 'car') 

,並返回:

Id TagId ItemId ItemTable Id Name SiteId 
------------------------------------------ 
1 1  1  Content 1 home 1 
2 1  2  Content 1 home 1 
3 1  3  Content 1 home 1 
4 2  4  Content 2 car 1 
5 2  5  Content 2 car 1 
6 2  12  Content 2 car 1 

,而不是僅僅兩個記錄,這些名稱是「家」和「車」 。我該如何解決它?

謝謝。

+1

展示和講解了數據庫結構!你爲什麼期望只有兩行來自JOIN? – 2010-03-27 22:19:15

+2

你期待什麼結果?您是否試圖獲得所有標記爲家庭和汽車的物品?在你的例子中沒有任何項目的標籤。 – 2010-03-27 22:23:00

回答

1

有兩個備選方案 - 使用連接:

SELECT * 
    FROM [Database].dbo.[TagsPerItem] tpi 
    JOIN [Database].dbo.[Tag] t_home ON t_home.id = tpi.tagid 
            AND t_home.name = 'home' 
    JOIN [Database].dbo.[Tag] t_car ON t_car.id = tpi.tagid 
           AND t_car.name = 'car' 

...或HAVING COUNT(DISTINCT t.name) = 2

SELECT --column list - fill with specific appropriate columns 
    FROM [Database].dbo.[TagsPerItem] tpi 
    JOIN [Database].dbo.[Tag] t ON t.id = tpi.tagid 
           AND t.name IN ('home', 'car') 
GROUP BY --column list - match columns declarations with the SELECT list without aggregates used on them 
    HAVING COUNT(DISTINCT t.name) = 2 
  • COUNT(DISTINCT是必要的, 「車」,否則兩個關係WOU ld是假陽性(假設可能在數據模型中)
  • 並非所有數據庫都支持COUNT(DISTINCT...);而乏味的構建,加入同一個表多次是一個更安全的方法
+0

第一個查詢將始終返回一個空集。 – 2010-03-28 12:07:01

0
SELECT DISTINCT Tag.Id, Tag.Name 
FROM [Database].dbo.[TagsPerItem] 
INNER JOIN [Database].dbo.[Tag] ON [Tag].Id = [TagsPerItem].TagId 
WHERE [Tag].Name IN ('home', 'car') 
3

這是因爲您告訴查詢返回每一列,所以SQL將返回每一個匹配的行。因此,您需要更改查詢以僅返回所需的列並添加DISTINCT子句(即SELECT DISTINCT)。

如果你提供你想要的輸出的一個例子,我們也許能夠提供更加有用的答案...

+0

如果使用Group By而不是DISTINCT,它會更快。 – vaske 2010-03-27 23:06:32

0
SELECT * 
    FROM [Database].dbo.[TagsPerItem] tpi_car 
    JOIN [Database].dbo.[TagsPerItem] tpi_home on tpi_home.ItemId = tpi_car.ItemId AND tpi_home. ItemTable = tpi_car. ItemTable 
    JOIN [Database].dbo.[Tag] t_home ON t_home.id = tpi_home.tagid 
            AND t_home.name = 'home' 
    JOIN [Database].dbo.[Tag] t_car ON t_car.id = tpi_car.tagid 
           AND t_car.name = 'car'