【问题标题】:Best way of dealing with "duplicates"处理“重复”的最佳方法
【发布时间】: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


【解决方案1】:

在 Oracle 中,每个 Table 中的每一行都有一个 ROWID,在 SQL Server 中,有一个未记录的列 %%physloc%% 与 ROWID 相同。

所以你可以试试。

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

有关 %%physloc%%

的更多信息,请参阅 stackoverflow 上写得很好的 answer

【讨论】:

    猜你喜欢
    • 2020-09-12
    • 2012-09-12
    • 1970-01-01
    • 2014-12-05
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    相关资源
    最近更新 更多