2

我的 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 QUERY?我需要所有列,但只需要业务关键列上的 DISTINCT。

感谢您的帮助。

下面是我的项目如何在 SSIS 中设置的图像,维度是 SCD 1。

4

1 回答 1

1

我首先将其拆分为两个操作:生成代理键和填充维度表。第一步将是 aDISTINCT仅 3 列,第二步将成为 a JOIN。索引两个操作中使用的列可能会给你一些改进。

您可以结合DISTINCTwithNOT 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 版本或版本。

于 2012-10-01T16:45:35.583 回答