Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查询1-Many表_Sql_Sql Server - Fatal编程技术网

Sql 查询1-Many表

Sql 查询1-Many表,sql,sql-server,Sql,Sql Server,我有两个表格,为了简单起见,我将用一个简单的问题来说明 产品表包含具有两列的产品定义 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 ID -- Product Name
产品详细信息表包含存储为垂直或扩展属性的产品详细信息

Product Detail ID -- Product Number -- Key ID -- Value ID
假设我有另外两个参考表,其中一个用于键,另一个用于值

键表

1 -- Price
2 -- Color
值表

1 -- Red
2 -- Blue
3 -- 10 $
4 -- 20$
我使用产品详细信息表作为垂直表,为产品添加所需的任意多个属性

现在来搜索记录

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

我有以下数据

产品表数据

Prod#1   XXX
Prod#2   YYY
1  Prod#1  1  4
2  Prod#1  2  1
产品详细信息表数据

Prod#1   XXX
Prod#2   YYY
1  Prod#1  1  4
2  Prod#1  2  1
第#1行:价格键值为20的产品1$ 第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中,这在单个查询中是否可行

谢谢诸如此类的东西:

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'

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

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

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

既然选择了这种非常奇怪的结构,为什么不为产品名称创建一个键?为什么奇怪?这是一种动态方式,允许我的客户在单个产品(一种垂直数据库)上添加1个或多个扩展属性。