gpt4 book ai didi

sql - 重构循环 SQL 插入

转载 作者:搜寻专家 更新时间:2023-10-30 20:04:11 26 4
gpt4 key购买 nike

此插入语句有效。但是,我希望有人可以教我一种更有效的方法来执行此查询。这就是我得到的...

我有一个名为 Source 的表,其中 DealerID 是一个非唯一 ID(无论如何在这个表中)。对于每个 DealerID,有多个名称。示例:

15  BillBoard
15 Event
15 Newspaper

16 BillBoard
16 Event
16 Newspaper

我知道,我知道。这是一种非常低效的存储数据的方式。我们正在处理遗留应用程序,我现在无法彻底检查此数据结构。所以,我需要做的是为每个 DealerID 添加两条新记录。一种用于“电话”,一种用于“互联网”。所以在插入之后,它看起来像这样:

15  BillBoard
15 Event
15 Newspaper
15 Phone
15 Internet

16 BillBoard
16 Event
16 Newspaper
16 Phone
16 Internet

下面的sql语句可以,但是我想知道有没有更好的方法...

declare @SourceTemp table (
[Id] int identity (1, 1) not null,
[DealerId] int
)

insert into @SourceTemp select distinct DealerId from Source where DealerId is not null

declare @dealerid int
declare @rowcount int = 1
declare @idcount int
select @idcount = max(Id) from @SourceTemp

while @rowcount < (@idcount + 1)
begin
select @dealerid = DealerId from @SourceTemp where Id = @rowcount

---------------- Insert Phone
if not exists (select * from Source where DealerId = @dealerid and Name = 'Phone')
begin
insert into
Source
([DealerID],[Name],[Service],[CampaignCode],[Description],[Created],[UserCreated],[Active])
values
(@dealerid, 'Phone', 'Generic', 'CampaignCode', NULL, GETDATE(), 0, 1)
end

--------------- Insert Internet
if not exists (select * from Source where DealerId = @dealerid and Name = 'Internet')
begin
insert into
Source
([DealerID],[Name],[Service],[CampaignCode],[Description],[Created],[UserCreated],[Active])
values
(@dealerid, 'Internet', 'Generic', 'CampaignCode', NULL, GETDATE(), 0, 1)
end

set @rowcount = @rowcount + 1
end

编辑之后:

我必须对 Tom 的回答做一个小修改,添加 DISTINCT。这有效...

INSERT INTO Source ([DealerID], [Name], [Service], [CampaignCode], [Description], [Created], [UserCreated], [Active])
SELECT DISTINCT
S.DealerId, SQ.Name, 'Generic', 'CampaignCode', NULL, GETDATE(), 0, 1
FROM
Source S
CROSS JOIN (SELECT 'Internet' AS Name UNION ALL SELECT 'Phone' AS Name) SQ
WHERE
NOT EXISTS (SELECT * FROM Source WHERE DealerID = S.DealerID AND Name = SQ.Name)

最佳答案

INSERT INTO Source (DealerID, Name, Service, CampaignCode, Description, ...)
SELECT DISTINCT
S.DealerID, SQ.Name, ...
FROM
Source S
CROSS JOIN (SELECT 'Internet' AS Name UNION ALL SELECT 'Phone' AS Name) SQ
WHERE
NOT EXISTS (SELECT * FROM Source WHERE DealerID = S.DealerID AND Name = SQ.Name)

已更正它以包含 DISTINCT,因为那里的每个 DealerID 都会有多个其他 Name。如果性能有问题,那么您可以将 DISTINCT 向下移动到 Source 表的子查询,然后从那里移动 CROSS JOIN:

INSERT INTO Source (DealerID, Name, Service, CampaignCode, Description, ...)
SELECT DISTINCT
S.DealerID, SQ.Name, ...
FROM
(SELECT DISTINCT DealerID
FROM Source
) S
CROSS JOIN (SELECT 'Internet' AS Name UNION ALL SELECT 'Phone' AS Name) SQ
WHERE
NOT EXISTS (SELECT * FROM Source WHERE DealerID = S.DealerID AND Name = SQ.Name)

关于sql - 重构循环 SQL 插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35297850/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com