SQL根据另一列自动填充ID列

时间:2019-11-12 23:57:08

标签: sql sql-server uniqueidentifier

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

-- 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字段(无需用户输入代码),该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列,但我不需要给每一行一个数字,而是需要为每个{ {1}}一个新数字。

有可能吗?

谢谢

1 个答案:

答案 0 :(得分:1)

可以使用dense_rank()来实现。

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

要使用目的地customer number来验证您的campaignnot 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)