0

我有两张表,为简单起见,我将用一个简单的问题来说明。

Product 表包含具有两列的产品定义

Product ID -- Product Name

产品详细信息表包含存储为垂直或扩展属性的产品详细信息

Product Detail ID -- Product Number -- Key ID -- Value ID

假设我有另外两个参考表,其中一个用于键,另一个用于值。

键表

1 -- Price
2 -- Color

值表

1 -- Red
2 -- Blue
3 -- 10 $
4 -- 20$

我将 Product Details 表用作垂直表来为产品添加任意数量的属性。

现在来搜索记录!

例如,我需要获取“所有”产品详细信息列匹配的所有产品。

我有以下数据

产品表数据

Prod#1   XXX
Prod#2   YYY

产品详情表数据

1  Prod#1  1  4
2  Prod#1  2  1

第 1 行:产品 1 具有值为 20$ 的价格键 第 2 行:产品 1 具有值为红色的颜色键

现在需要执行以下查询:

1- Get Products with Key "Price" having a price > 10$
2- Get Products with a Key "Price" > 10 AND "Color" is Red

这在 TSQL 中的单个查询中可行吗?

谢谢

4

2 回答 2

0

您只需 1 个查询即可完成这项工作,如下所示:

SELECT Products.ProductId, Products.ProductName FROM Products
INNER JOIN ProductDetails ON Products.ProductId = ProductDetails.ProductId
INNER JOIN Keys ON ProductDetails.KeyId = Keys.Id
INNER JOIN Values ON ProductDetails.ValueId = Values.Id
WHERE Keys.Name = 'Price' AND Values.Value > @Value

问题是 Values 表的数据类型,必须定义 Value 字段。如果您选择字符串,那么如果要将其与整数值进行比较,则必须将其转换为整数。

于 2012-08-21T12:11:05.080 回答
0

像这样的东西:

select
  distinct p.product_id
from
  products p
  inner join product_details pd_price on p.product_id = pd_price.product_id
  inner join keys as k_price on pd_price.key_id = k_price.key_id
  inner join values as v_price on pd_price.value_id = v_price.value_id
  inner join product_details pd_color on p.product_id = pd_color.product_id
  inner join keys as k_color on pd_color.key_id = k_color.key_id
  inner join values as v_color on pd_color.value_id = v_color.value_id
where
  k_price.name = 'Price' and v_price.value > 10 and
  k_color.name = 'Color' and v_color.value = 'Red'
于 2012-08-21T12:09:28.320 回答