2017-03-18 84 views
0

我的問題是我無法查詢匹配的記錄。SQL Server內部加入Where子句

查詢應做到以下幾點:

ID | Name | Value 
-- | ------ | ------ 
1 | Color | Red 
1 | Color | Blue 
1 | Color | Green 
1 | Sizes | 1cm 
1 | Sizes | 5cm 
2 | Color | Yellow 
2 | Color | Green 
2 | Sizes | 5cm 
2 | Sizes | 10cm 

查詢1:

  • 顏色爲紅色或藍色
    -AND-
  • 尺寸埃= 1cm

返回匹配記錄DS(ID = 1)

問題2:

  • 顏色=黃色或綠色
    -AND-
  • 大小=5釐米

返回匹配的記錄(ID = 1 ,2)

我的查詢:

SELECT a.ID, b.Name, c.Value 
FROM table1 a 
INNER JOIN table2 b ON a.Id = b.aId 
INNER JOIN table3 c ON b.ID = c.bId 
WHERE (c.Value = (CASE b.Name WHEN 'Color' THEN 'Red' END) 
     OR 
     c.Value = (CASE b.Name WHEN 'Color' THEN 'Blue' END) 
    ) 
    AND (c.Value = (CASE b.Name WHEN 'Sizes' THEN '1cm' END)) 

它不工作方式:(

我會很高興,如果你能幫助我。

+0

這絕對不是設置數據庫表的方法。甚至可以查看規範化,谷歌或維基百科。 – Edward

回答

0

剛剛返回的所有行,你需要的東西是這樣的:

SELECT a.ID, b.Name, c.Value 
FROM table1 a 
INNER JOIN table2 b ON a.Id = b.aId 
INNER JOIN table3 c ON b.ID = c.bId 
WHERE ((b.Name = 'Color' and c.Value in ('Red', 'Blue')) 
     OR 
     (b.Name = 'Sizes' and c.Value = '1cm') 
    ) 

但你可能實際上要做到這一點,檢查其中兩個條件匹配:

SELECT a.ID, b2.Name, c2.Value 
FROM table1 a 
INNER JOIN table2 b2 ON a.Id = b2.aId 
INNER JOIN table3 c2 ON b.ID = c2.bId 
WHERE EXISTS (SELECT 1 
       FROM table2 b 
       JOIN table3 c ON b.ID = c.bId 
       WHERE a.Id = b.aId 
       AND b.Name = 'Color' 
       AND c.Value in ('Red', 'Blue')) 
    AND EXISTS (SELECT 1 
       FROM table2 b 
       JOIN table3 c ON b.ID = c.bId 
       WHERE a.Id = b.aId 
       AND b.Name = 'Sizes' 
       AND c.Value = '1cm') 
+0

如何獲取第二個查詢中的字段(名稱和值) –

+0

您也可以在該查詢中以相同的方式連接表。擁有不同的別名可能會使其更加清晰 –