【发布时间】:2020-02-06 16:49:03
【问题描述】:
我是 sql 编程新手。我编写了这个程序来并排比较每个 [cg 代码] 的列。即使找不到匹配项,我也想从左表中获取行(查看 where 条件)。每当找不到匹配项时,我想将左表中的一行插入 cig_attributes_comparison 表中,右列为 NULL。我使用游标的原因是,表有大量行。由于交叉连接将获取大量行,因此我使用游标一次处理一个 [cg 代码]。
BEGIN
DECLARE @ProcessingCG nvarchar(50);
DECLARE @cg_count INT;
SET @cg_count = 0;
TRUNCATE TABLE [PDDMN_ACCESS].dbo.cig_attributes_comparison;
DECLARE distinctcg CURSOR FOR
SELECT DISTINCT [CG Code]
FROM [PDDMN_ACCESS].dbo.V_PDDMN_PMUSA_RRpt_FDA905SE_CigAttributes
OPEN distinctcg;
-- Fetch the first CG from the cursor to process
FETCH NEXT FROM distinctcg INTO @ProcessingCG
-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN
-- count the number of cgs processed
SET @cg_count = @cg_count + 1;
-- Commit after processing every 100 CGCODES
IF @cg_count% 100 = 0
BEGIN
BEGIN TRANSACTION
COMMIT;
END
INSERT INTO cig_attributes_comparison ([temporary se number left],
[cg code left], [component left], [subcomponent left],
[table usage left], [function name left],
[function uom left], [function ll left],
[function tgt left], [function ul left],
[sort order left],
[submission type left],
[component material left],
[component material group left],
[temporary se number right],
[cg code right],
[component right],
[subcomponent right],
[table usage right],
[function name right],
[function uom right],
[function ll right],
[function tgt right],
[function ul right],
[sort order right],
[submission type right],
[component material right],
[component material group right])
SELECT
lft.[temporary se number], lft.[cg code], lft.[component],
lft.[subcomponent], lft.[table usage],
lft.[function name],
lft.[function uom],
lft.[function ll],
lft.[function tgt],
lft.[function ul],
lft.[sort order],
lft.[submission type],
lft.[componentmaterial],
lft.[componentmaterialgroup],
rgt.[temporary se number],
rgt.[cg code],
rgt.[component],
rgt.[subcomponent],
rgt.[table usage],
rgt.[function name],
rgt.[function uom],
rgt.[function ll],
rgt.[function tgt],
rgt.[function ul],
rgt.[sort order],
rgt.[submission type],
rgt.[componentmaterial],
rgt.[componentmaterialgroup]
FROM
[PDDMN_ACCESS].dbo.V_PDDMN_PMUSA_RRpt_FDA905SE_CigAttributes lft,
[PDDMN_ACCESS].dbo.V_PDDMN_PMUSA_RRpt_FDA905SE_CigAttributes rgt
WHERE
lft.[cg code] = @ProcessingCG
AND lft.[cg code] <> rgt.[cg code]
AND ISNULL(lft.component, ' ') = ISNULL(rgt.component, ' ')
AND ISNULL(lft.subcomponent, ' ') = ISNULL(rgt.subcomponent, ' ')
AND ISNULL(lft.[table usage], ' ') = ISNULL(rgt.[table usage], ' ')
AND ISNULL(lft.[function name], ' ') = ISNULL(rgt.[function name],' ')
AND ISNULL(lft.[function uom], ' ') = ISNULL(rgt.[function uom], ' ')
FETCH NEXT FROM distinctcg into @ProcessingCG
END
CLOSE distinctcg;
DEALLOCATE distinctcg;
END
【问题讨论】:
-
ANSI-92 样式连接已经存在了近 30 年。是时候更新您的连接语法了。 sqlblog.org/2009/10/08/bad-habits-to-kick-using-old-style-joins 你不需要游标来插入数据。这可以并且应该更改为单个插入语句。
标签: sql sql-server join