SQL Сервер перекрестного соединения для сравнения - PullRequest
1 голос
/ 06 февраля 2020

Я новичок в 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 

1 Ответ

0 голосов
/ 06 февраля 2020

То, что вы хотите сделать, это использовать LEFT JOIN вместо курсора, который в этом случае будет излишним для использования. Объединение даст вам все необходимое из левой таблицы и нули справа, где совпадения не найдены. Просто укажите в классе WHERE, что правильные результаты IS NULL отфильтруют по несуществующим из них для включения в вашу вставку.

Ниже приведен пример того, как вы можете это сделать:

INSERT INTO comparison_table

SELECT
    -- specify your needed columns here, 
    -- only using * for illustration purposes
    *
FROM
    table1
    LEFT JOIN table2
    ON table1.shared_column = table2.shared_column
WHERE
    table2.table_id IS NULL;

Узнайте больше о SQL JOINS и ANSI SQL, вот несколько полезных ссылок, которые помогут вам:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...