【问题标题】:SQL Server cross join for comparison用于比较的 SQL Server 交叉联接
【发布时间】: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 

【问题讨论】:

标签: sql sql-server join


【解决方案1】:

您想要做的是使用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 的更多信息,这里有一些有用的链接可以帮助您:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多