【发布时间】:2014-10-05 18:58:11
【问题描述】:
我有一个存储过程,可将数据从 ERP 提取到数据仓库 (DW)。 我面临的问题是来自 DW 的人要求我为我没有的每一行设置一个唯一的 ID。
一个例子
CREATE TABLE [dbo].[INVOICES](
[InvID] [nchar](10) NULL,
[LineID] [nchar](10) NULL,
[Amount] [decimal](32, 4) NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[DISTRIBUTION](
[InvID] [nchar](10) NULL,
[LineID] [nchar](10) NULL,
[Percent] [decimal](3, 2) NULL
) ON [PRIMARY]
InvID LineID Amount
---------- ---------- ---------------------------------------
FC0000001 1 6788.0000
FC0000001 2 8908.0000
InvID LineID Percent
---------- ---------- ----------------------
FC0000001 1 10
FC0000001 1 90
FC0000001 2 100
所以,你可以查询:
SELECT I.InvID + '-' + D.LineID AS ID, D.*
FROM [INVOICES] AS I
LEFT JOIN [DISTRIBUTION] AS D
ON D.InvID = I.InvID
and D.LineID = I.LineID
会得到:
ID InvID LineID Percent
-------------------- ---------- ---------- ----------------------
FC0000001-1 FC0000001 1 10
FC0000001-1 FC0000001 1 90
FC0000001-2 FC0000001 2 100
但是,如您所见,如果 [DISTRIBUTION] 中有两条记录具有相同的 LineID 和 InvID,则您会从上面的查询中获得两条记录,并且表 [DISTRIBUTION] 不包含每行的 ID。
问题
所以,我需要动态创建一个 ID,即:
- 唯一(每行必须不同)
- 可重复(每次运行进程,相同的记录必须具有相同的 ID 值)
- 我没有 ERP 级别的 ID。我不能只在 [DISTRIBUTION] 中添加和 ID 表,因为它是第三方,设计不佳的 ERP。
我已经尝试过的
- 二进制校验和不安全,如果数据发生变化,ID 也会发生变化。
- ROW_NUMBER() 是我正在使用的,但是...我对此并不满意。影响性能 而且,它有可能改变。
- 辞职不是我的选择:)
【问题讨论】:
-
我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
-
它是哪个 ERP - 可能有人已经解决了您的问题?您是否联系过他们的支持人员?
-
分布是否可能发生变化,或者行项目是否可能发生变化?如果是这样,我认为“可重复”是不可能的,除非您存储分布和订单项之间的映射。
-
能否请您澄清这个要求 - '可重复(每次我运行该过程,相同的记录必须具有相同的 ID 值)。究竟是什么定义了记录是相同的?哪些数据可以更改并且记录仍应计入相同的数量?我认为,如果所有列都可能发生变化,您需要对本质上不安全的任何记录进行物理参考。因此,如果您在
DISTRIBUTION中有独特的内容,请使用二进制校验和 - 如果数据更改,则意味着记录被删除。 -
您说您不能使用“二进制检查”来制作某种聚合 ID,因为数据可能会更改,但也是数据使您拥有“重复”行?如果百分比发生变化,则行发生变化,那么它是否应该具有相同的标识?
标签: sql-server tsql uniqueidentifier