我正在尝试查询两个以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等......
由于
答案 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)