首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用另一个表列数据查找一个表中的行

使用另一个表列数据查找一个表中的行
EN

Stack Overflow用户
提问于 2012-07-25 17:44:29
回答 2查看 1.5K关注 0票数 0

我有两张桌子tab1tab2tab1有39000条记录,tab2有15000条记录。tab1tab2都有两个公共列,分别是item_numbercolor_code。但在tab1中,color_code可能为null,但在tab2中不是。两个表中的item_number都不为null。在tab2中,我必须从tab1插入一行(基于两列的唯一行)数据。为此,我编写了一个过程,如下所示。它将比较每一行,但耗时太长。有没有什么方法可以提高性能。先取两个游标:

代码语言:javascript
复制
CURSOR CUR_tab1 IS SELECT item_number,color_code FROM 
    (SELECT item_number,color_code, SNO RID ,
         MIN(SNO) OVER(partition BY item_number,color_code)
         MIN_RID FROM   tab1  ) WHERE RID= MIN_RID;

CURSOR CUR_tab2 IS SELECT sno_2,item_number,color_code,PRIORITY FROM tab2;

sonsno_2tab1tab2中的主键。

为了在一个表中查找记录,我使用了一个for loop

代码语言:javascript
复制
SELECT NVL(MAX(SNO_2),0) INTO SNO_COUNT FROM tab2;
FOR CUR_tab1  IN CUR_NIIN_CAGE
LOOP
    -- GET THE NIIN_CAGE_PART RECORDS DATA.
    OLD_NNCGP_NIIN := CUR_tab1 .item_number;
    OLD_NNCGP_HCC  := CUR_tab1 .color_codeC;

    IF (SNO_COUNT>0 AND OLD_NNCGP_HCC IS NOT NULL) THEN  -- IF RECORDS EXISTS IN DB  
        FOR CUR_tab2 IN CUR_NIIN_HCC
        LOOP
            OLD_NIIN        := CUR_tab2.item_number;
            OLD_HCC         := CUR_tab2.color_codeC;
            NIIN_PRIORITY   := CUR_tab2.PRIORITY;

            IF (trim(OLD_NNCGP_NIIN) = trim(OLD_NIIN)
                AND trim(OLD_NNCGP_HCC)=trim(OLD_HCC)) THEN
                -- DO NOTHING
                ROW_COUNT:=0;
                PROCESSED   :=FALSE;
                EXIT;
            ELSE
                ROW_COUNT:=ROW_COUNT+1;
                PROCESSED   :=TRUE;
            END IF;
        END LOOP;
    ELSIF (SNO_COUNT=0 AND OLD_NNCGP_HCC IS NOT NULL) THEN
         PROCESSED   :=TRUE;
         ROW_COUNT:=ROW_COUNT+1;                  
    END IF;  

    IF (  PROCESSED ) THEN
        SNO_COUNT :=SNO_COUNT+1;   
        INSERT INTO tab2("SNO2","color_code","item_number","PRIORITY") 
        values (SNO_COUNT,OLD_NNCGP_HCC,OLD_NNCGP_NIIN,NULL);
        COMMIT;
    END IF;

    PROCESSED:=FALSE;
    ROW_COUNT:=0;
END LOOP;

但这需要近7分钟的时间。有没有更好的方法来比较这些列?

EN

回答 2

Stack Overflow用户

发布于 2012-07-25 18:42:02

现在还不完全清楚你想要实现什么。基于一个或多个列值确保行的唯一性的常规方法是创建唯一索引。

代码语言:javascript
复制
alter table <table>
  add constraint <constraint_name> unique (<column1>,..,<column_n>);

每当您尝试插入表中已存在的列值组合的记录时,都会引发异常(DUP_VAL_ON_INDEX)。

票数 0
EN

Stack Overflow用户

发布于 2012-07-25 21:15:16

您的代码以痛苦的Row为基础在Row上插入记录。这就是为什么它很慢的原因。SQL是一种集合-based语言。因此,拥抱Set的快乐,并看到您的性能提高。

不幸的是,你没有发布你的整个代码示例,所以下面的细节可能是错误的,但它应该会向你展示正确的想法:

代码语言:javascript
复制
    SELECT NVL(MAX(SNO_2),0) INTO SNO_COUNT FROM tab2;        

    INSERT INTO tab2("SNO2","color_code","item_number","PRIORITY")  
        select SNO_COUNT+rownum,tab1.color_codeC,tab1.item_number,NULL)
        from 
        ( select distinct tab1.color_codeC,tab1.item_number
          from tab1
          where not exists
             ( select null from tab2
               where trim(tab1."color_codeC") = trim(tab2."color_codeC")
               and trim(tab1."item_number") = trim(tab2."item_number") )

关于你的数据模型,有几件事是不好的。

使用MAX的

  1. (SNO_COUNT)。这种技术不能扩展,在多用户环境中也不起作用。您应该改用Oracle序列。使用双引号的大小写混合标识符的
  2. 。这只是一系列等待发生的ORA-00904错误。只需使用大写的标识符,而不用考虑double-quotes.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11646978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档