Я новичок в sql программировании. Я написал эту процедуру для параллельного сравнения столбцов для каждого [cg code]. Я хочу получить строки из левой таблицы, даже если совпадение не найдено (см. Условие где). Когда совпадение не найдено, я хочу вставить строку из левой таблицы в таблицу cig_attributes_comparison с правыми столбцами, равными NULL. Причина, по которой я использовал курсор, состоит в том, что таблица содержит большое количество строк. Поскольку перекрестное соединение будет собирать большое количество строк, я использовал курсор для обработки по одному [cg code] за раз.
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