2017-03-18 82 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

您也可以在该查询中以相同的方式连接表。拥有不同的别名可能会使其更加清晰 –