【问题标题】:Multiple WHERE clause for same Columns in TSQLSQL中相同列的多个WHERE子句
【发布时间】:2012-04-11 19:15:53
【问题描述】:

我正在尝试查询两个处于一对多关系的表。 我所做的是创建一个视图,知道我最终可能会为第一个表创建多个记录。

我的场景如下:我有一个表“项目”和表“属性”。

“Properties”表包含一个 ItemsId 列、PropertyId、PropertyValueId 列。

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

我将如何查询该“视图”,以便我想获取具有“PropertyId”和“PropertyValueId”值组合的所有“项目”记录。

换句话说,类似于:

在哪里 (PropertyId = @val1 AND PropertyValueId = @val2) 或 (PropertyId = @val3 AND PropertyValueId = @val4) 或 (PropertyId = @val5 AND PropertyValueId = @val6)

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

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

“项目”对象具有属性/值的集合。 Prop1:val1、Prop2:val2 等...

谢谢

【问题讨论】:

  • 如果它们都是表,你不能只使用两列连接吗?您能清楚 Items 表的外观以及 val1、val2 等的来源吗?
  • 谢谢。我更新了上面的文字
  • 我看到人们用 SQL 回答,但我假设您正在寻找 linq 查询?否则我不理解实体框架标签。

标签: tsql entity-framework-4


【解决方案1】:

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

如果 Items 是您需要的属性名称-值对的规范(并且与 Properties 上的 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,它们对于 items 中定义的每个属性都有一个(并且只有一个)属性值。如果需要,您可以将项目计数放入变量中。

【讨论】:

    【解决方案2】:

    我会使用这样的查询:

    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)
    

    【讨论】:

    • 将表作为参数传递给查询?
    • 作为一个选项,是的,如果您使用的是支持表值参数的 SQL Server 2008+。另一种方法可能是将列表作为 CSV 字符串传递,使用函数将其拆分为行,然后可能将每个项目拆分为两列(属性 id 和属性值 id)。或者您可以事先准备一个包含所需属性的临时表,并在查询中使用该表。 (因此,您将隐式传递参数,这可能是一个好主意,也可能不是一个好主意,具体取决于您的情况。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    相关资源
    最近更新 更多