我有一个工作流程,其中使用源表填充目标表。
我尝试在下面的代码中模拟此工作流程。
-- 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}}一个新数字。
有可能吗?
谢谢
答案 0 :(得分:1)
可以使用dense_rank()
来实现。
SELECT dense_rank() over (order by CampaignName) as rn, CampaignName, CustomerNumber
FROM #SourceTable
要使用目的地customer number
来验证您的campaign
和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)