【问题标题】:SQL Auto-populate ID column based on another columnSQL 根据另一列自动填充 ID 列
【发布时间】:2019-11-12 23:57:08
【问题描述】:

我有一个使用源表填充目标表的工作流程。
我试图在下面的代码中模拟这个工作流程。

-- creating/populating source table
CREATE TABLE #SourceTable
(
     CampaignName VARCHAR(50),
     CustomerNumber INT
)

INSERT INTO #SourceTable 
VALUES ('Campaign1', 1111), ('Campaign1', 2222), ('Campaign1', 3333),
       ('Campaign2', 4444), ('Campaign2', 2222), ('Campaign2', 1111)

-- create/populate destination table
CREATE TABLE #DestinationTable
(
    CampaignID INT,
    CampaignName VARCHAR(50),
    CustomerNumber INT
)

-- Simulating populating the #DestinationTable
INSERT INTO #DestinationTable (CampaignName, CustomerNumber)
    SELECT CampaignName, CustomerNumber
    FROM #SourceTable

源表将以某种方式创建,但随后它用于以与我的示例代码相同的方式填充目标表。

目标表在 CustomerNumber 级别。我想自动填充一个 ID 字段(无需用户对其进行编码),它将在 CampaignName 级别提供一个新数字。

例如,我希望#DestinationTable 的输出为:

CampaignID  CampaignName    CustomerNumber
------------------------------------------
1           Campaign1         1111
1           Campaign1         2222
1           Campaign1         3333
2           Campaign2         4444
2           Campaign2         2222
2           Campaign2         1111

但是我需要在插入新行时自动填充 CampaignID 列,例如 IDENTITY 列,但我不需要给每一行一个数字,而是给每个 CampaignName 一个新的数字。

这可能吗?

谢谢

【问题讨论】:

    标签: sql sql-server uniqueidentifier


    【解决方案1】:

    这可以使用dense_rank() 来实现。

    SELECT dense_rank() over (order by CampaignName) as rn, CampaignName, CustomerNumber
    FROM #SourceTable
    

    要验证您的 customer numbercampaign 名称是否已存在于您的目的地,请使用 not exists 关键字。

    SELECT dense_rank() over (order by t1.CampaignName) as rn, t1.CampaignName, t1.CustomerNumber
    FROM #SourceTable t1
    WHERE not exists (select 1 from #DestinationTable t2
        where t2.CustomerNumber = t1.CustomerNumber and t2.CampaignName = t1.CampaignName)
    

    【讨论】:

    • 我已经阐明了自动填充的要求。我需要它来填充而无需用户编写代码。类似于身份字段。另外,当向表中添加新行时,你会编写代码吗?
    • 此查询来自您的源表,因此如果您的源表为空,则不会生成行。
    • 好的,我现在看到了。 Destination 表已经填充了 CampaignID 列。那么您的查询如何知道不提供与 Destination 表中已经存在的 ID 相同的 ID?目标表被附加到每个插入上,因此查询需要考虑已经存在的数字。我想到了一个解决方案,将与您的代码类似的代码添加到 INSTEAD OF 触发器。
    • 我认为这样的事情会奏效。我真正希望的是一种将IDENTITY 类型字段操作为PARTITION BY 特定列的方法。希望已经有内置的东西可以做到这一点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 2021-01-24
    相关资源
    最近更新 更多