2014-10-05 134 views
2

我有一个从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,您将从查询ab获得两条记录并且,[DISTRIBUTION]表中不包含每行的ID。

的问题

所以,我需要创建是动态的ID:

  • 独特(每个行必须是不同的)
  • Repeteable(我每次运行的时间过程中,相同的记录必须具有相同的ID值)
  • 我无法在ERP级别上获得ID。我不能在[DISTRIBUTION] 表中添加和标识,因为它是第三方,设计不良的ERP。

我已经尝试过

  • 二进制校验和是不是安全,如果数据更改ID的变化。
  • ROW_NUMBER()是我正在使用的,但是...我不适合它。影响性能 ,并有可能发生变化。
  • GRUB.EXE返回我的工作是不是一种选择:)
+1

我编辑了自己的冠军。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 – 2014-10-05 18:59:33

+0

它是哪一种ERP--可能有人已经解决了你已经存在的问题?你有联系他们的支持吗? – 2014-10-05 19:26:51

+0

分销是否有可能改变,或者订单项有可能改变?如果是这样,我认为“可重复”是不可能的,除非您存储分布和订单项之间的映射。 – 2014-10-05 19:38:12

回答

0

在Oracle中有ROWID在每个表的每一行,SQL Server上有一个无证列%% physloc %%一样的ROWID 。

所以在你的情况下,你可以尝试。

SELECT %%physloc%%, * 
FROM [DISTRIBUTION] 

看得很清楚写上answer计算器更多信息上%% physloc %%