我有一个表在我的SQL Server,我“舞台”我的数据仓库从我们的ERP系统提取物。
从这个临时表( 表名称:DBO.DWUSD_LIVE),我建我的尺寸和负荷我的事实数据。
一个例子DIMENSION表被称为“SHIPTO”,这尺寸具有以下的列:
"shipto_id
"shipto"
"salpha"
"ssalpha"
"shipto address"
"shipto name"
"shipto city"
现在我有一个SSIS包,做了SELECT DISTINCT跨越上述列检索“独一无二”的数据,然后通过SSIS包我分配“shipto_id”代孕关键。
我目前的TSQL查询的一个例子是:
SELECT DISTINCT
"shipto", "salpha", "ssalpha", "shipto address", "shipto name", "shipto city"
FROM DBO.DWUSD_LIVE
这个伟大的工程,但不是“迅速”,一些尺寸有10列,并做了不同的选择那些并不理想。
在这方面,我的“业务键”列“SHIPTO”,“SALPHA”和“SSALPHA”。
所以,如果我做的:
SELECT DISTINCT
"shipto", "salpha", "ssalpha"
FROM DBO.DWUSD_LIVE
它会产生相同的结果:
SELECT DISTINCT
"shipto", "salpha", "ssalpha", "shipto address", "shipto name", "shipto city"
FROM DBO.DWUSD_LIVE
有没有更好的办法做到这一点TSQL查询? 我需要的所有列,但仅在业务键列DISTINCT。
您的帮助表示赞赏。
下面是我的项目是如何在SSIS设置的图像时,尺寸是SCD 1。
生成代理键和填充维度表:我会通过拆分到这两个操作开始。 然后,第一步骤将是一个DISTINCT
上只有3列,并且所述第二步骤将成为JOIN
。 然后在索引操作都使用的列可能给你一些改进。
你可以结合DISTINCT
用NOT EXISTS
来避免那些已经被映射处理行,是这样的:
insert into dbo.KeyMappingTable (shipto, salpha, ssalpha)
select distinct shipto, salpha, ssalpha
from dbo.Source
where not exists (
select *
from dbo.KeyMappingTable
where shipto = dbo.Source.shipto and salpha = dbo.Source.salpha and ssalpha = dbo.Source.ssalpha
)
然后,你必须映射,所以你可以这样做:
insert into dbo.DimShipTo (shipto_id, shipto /*, etc. */)
select
m.shipto_id,
s.shipto -- etc.
from
dbo.KeyMappingTable m
join dbo.Source s
on m.shipto = s.shipto and m.salpha = s.salpha and m.ssalpha = s.ssalpha
where
not exists (
select *
from dbo.DimShipTo
where shipto_id = m.shipto_id
)
你也应该看看MERGE
,这是方便,如果您使用的是1型尺寸,只想当他们改变(这一般是一个有用的命令),更新地址或其他属性。 但是,这只能从SQL Server 2008中; 你没有提到你正在使用的版本或版本的SQL Server。
文章来源: SQL Datawarehousing, need help populating my DIMENSION using TSQL SELECT or a better alternative?