我正在为我的 DBMS 使用 Sql Server 2012。
在我的数据库中,我有一个与一系列目录表相关的产品表。这些目录表代表各种产品类别。这个想法是,虽然所有产品都有某些共同的属性(我们的内部标识符、供应商、成本等),但产品的细节会有所不同(家具的描述方式与描述数字产品的方式不同) .
此外,每个产品都有一个父实体。父母可能有多个孩子(或在这种情况下的产品)。
我的任务是为给定的父 ID 列表选择产品和相关信息,并将该信息填充到 XML 文档中。
我目前正在使用的表是:
- 产品
- 产品_数码
- 产品中心_家具
Product 与 Product_Id 上的 PRODUCT_DIGITAL 具有 PK/FK 关系。PRODUCT 与 PRODUCT_FURNITURE 存在相同类型的关系。
如果产品看起来像这样:
PRODUCT_ID -- PRODUCT_CATEGORY -- PARENT_ID -- PARENT_TYPE -- DELIVERY_IN_DAYS
100 DIG 1 1 7
101 DIG 1 1 8
102 DIG 1 1 1
103 DIG 2 1 2
104 DIG 2 1 1
PRODUCT_DIGITAL 看起来像这样:
PRODUCT_ID -- PRODUCT_TYPE -- PRODUCT_NAME -- PRODUCT_MNEMONIC
100 A IMG1 IMAWTRFL
101 B SND1 SNDENGRV
102 B SND2 SNDHRSLF
103 A IMG2 IMGNBRTO
104 B SND3 SNDGTWNE
最后,我想要如下所示的结果集:
PRODUCT_CATEGORY -- PRODUCT_ID -- PRODUCT_TYPE -- PARENT_ID -- DELIVERY_IN_DAYS -- PROD_EXTENSION_NAME -- PROD_EXTENSION_TYPE -- PROD_EXTENSION_VALUE
DIG 100 A 1 7 PRODUCT_NAME STRING IMG1
DIG 100 A 1 7 PRODUCT_MNEMONIC STRING IMAWTRFL
DIG 101 B 1 8 PRODUCT_NAME STRING SND1
DIG 101 B 1 8 PRODUCT_MNEMONIC STRING SNDENGRV
DIG 102 B 1 1 PRODUCT_NAME STRING SND2
DIG 102 B 1 1 PRODUCT_MNEMONIC STRING SNDHRSLF
DIG 103 A 2 2 PRODUCT_NAME STRING IMG2
DIG 103 A 2 2 PRODUCT_MNEMONIC STRING IMGNBRTO
DIG 104 B 2 1 PRODUCT_NAME STRING SND3
DIG 104 B 2 1 PRODUCT_MNEMONIC STRING SNDGTWNE
我最初的搜索将我带到了 UNPIVOT - 但到目前为止,我还无法理解它。我最终做的是创建一个临时表并在通行证中更新它,然后重新加入产品表以进行最终选择:
create table #tbl(product_id int, prod_extension_name varchar(100), prod_extension_type varchar(100), prod_extension_value varchar(1000))
insert into #tbl
select p.product_id, c.column_name,
case c.data_type
when 'varchar' then 'string'
else data_type end as data_type
, null
from dbo.product p, information_schema.columns c
where c.table_name = 'PRODUCT_DIGITAL'
and c.column_name in ('PRODUCT_NAME','PRODUCT_MNEMONIC')
update #tbl
set prod_extension_value = p.product_name
from dbo.product p
where #tbl.product_id = p.product_id
and #tbl.colname = 'PRODUCT_NAME'
update #tbl
set prod_extension_value = p.product_mnemonic
from dbo.product p
where #tbl.product_id = p.product_id
and #tbl.colname = 'PRODUCT_MNEMONIC'
select p.product_category, p.product_id, pd.product_category, #tbl.prod_extension_name, #tbl.prod_extension_type, #tbl.prod_extension_value
from dbo.product p inner join dbo.product_digital pd on p.product_id = pd.product_id
inner join #tbl on p.product_id = #tbl.product_id
order by product_id
有人可以指出一个更好的方法来做到这一点吗?似乎我应该能够更快地做到这一点,而不必进行多次更新等。