SQL中相同列的多个WHERE子句

时间:2012-03-28 08:03:57

标签: tsql entity-framework-4

我正在尝试查询两个以1对多关系的表。 我所做的就是创建一个View,知道我可能会为第一个表创建多个记录。

我的方案如下:我有一个表“Items”和表“Properties”。

“Properties”表包含ItemsId列,PropertyId,PropertyValueId列。

“Items”表/对象包含“属性”列表。

我如何查询“查看”这样,我想获得所有“项目”记录,其中包含“PropertyId”和& “PropertyValueId”值。

换句话说,类似于:

WHERE
 (PropertyId = @val1 AND PropertyValueId = @val2) OR
 (PropertyId = @val3 AND PropertyValueId = @val4) OR
 (PropertyId = @val5 AND PropertyValueId = @val6)

WHERE子句只是“Items.Properties”集合的循环。

“Items”表示存储在数据库中的Items表。每个&每个Item都有一些动态属性,一个或多个。这就是为什么我有另一个名为“属性”的表。属性表包含列: ItemId,PropertyId,PropertyValue

“Item”对象具有Properties / Values的集合。 Prop1:val1,Prop2:val2等......

由于

2 个答案:

答案 0 :(得分:0)

我可能没有理解你的要求(尽管有更新) - 如果这个或任何其他答案没有解决问题,请为项目,属性和输出添加一些样本数据,然后希望它会变得清晰。

如果Items是您需要的属性名称 - 值对的规范(并且与属性上的ItemId无关,这看起来很奇怪......)

select p.itemid  
from properties p  
where exists (select 1 from items i where i.propertyId = p.propertyId and i.propertyValueId = p.propertyValueId)  
group by p.itemid  
having count(distinct p.propertyid) = (select count(*) from items)

这将返回一组itemid,这些itemid对于items中定义的每个属性都有一个(且只有一个)属性值。如果需要,可以将项目计数放入变量中。

答案 1 :(得分:0)

我会使用这样的查询:

SELECT ItemId
FROM ItemView
WHERE (PropertyId = @val1 AND PropertyValueId = @val2)
   OR (PropertyId = @val3 AND PropertyValueId = @val4)
   OR (PropertyId = @val5 AND PropertyValueId = @val6)
GROUP BY ItemId
HAVING COUNT(*) = 3

WHERE子句与您的问题中的相同,只有在行具有匹配属性时才允许选择行。您只需要确保获得的项目具有 all 过滤器中的属性,这在上面的查询中借助HAVING子句完成:您正在请求项目3个特定属性,因此结果集中每个项目的属性数(COUNT(*))应等于3.

在更一般的情况下,当查询的属性数量可能是任意的时,您应该考虑以表格的形式传递参数并将视图连接到它:

…
FROM ItemView v
  INNER JOIN RequestedProperties r ON v.PropertyId      = r.Id
                                  AND v.PropertyValueId = r.ValueId
GROUP BY v.ItemId
HAVING COUNT(*) = (SELECT COUNT(*) FROM RequestedProperties)