Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-如果值存在于另一个表中,则插入到表中_Sql_Oracle_Toad - Fatal编程技术网

SQL-如果值存在于另一个表中,则插入到表中

SQL-如果值存在于另一个表中,则插入到表中,sql,oracle,toad,Sql,Oracle,Toad,我正在尝试使下面的sql查询正常工作,但出现了一个错误,我的问题如下: 我需要循环使用select语句中的结果集(这部分很好)。在每一行的循环中,我需要检查表A中是否存在URL。如果是,则将映射插入表B,否则将新行插入表C 这就是我所拥有的,但当我尝试执行时,我在IF上得到一个错误,即ORA-06550:第8行,第15列:PLS-00103:遇到符号“SELECT”时,预期出现以下情况之一:(+case mod new no.) DECLARE STANDARD_LINK_ID TABLEB.

我正在尝试使下面的sql查询正常工作,但出现了一个错误,我的问题如下:

我需要循环使用select语句中的结果集(这部分很好)。在每一行的循环中,我需要检查表A中是否存在URL。如果是,则将映射插入表B,否则将新行插入表C

这就是我所拥有的,但当我尝试执行时,我在IF上得到一个错误,即ORA-06550:第8行,第15列:PLS-00103:遇到符号“SELECT”时,预期出现以下情况之一:(+case mod new no.)

DECLARE 
STANDARD_LINK_ID TABLEB.LINK_ID%type;

BEGIN   
      FOR LINK_ROW IN ( SELECT LINKTEXT, LINKURL, CORPID FROM OLD_DATA)
      LOOP
          IF (SELECT COUNT(URL) FROM TABLEA WHERE URL = LINK_ROW.LINKURL) = 1
          THEN
            SELECT LINKID INTO STANDARD_LINK_ID FROM TABLEA WHERE URL = LINK_ROW.URL;
            INSERT INTO TABLEB(LINK_ID, CORP_ID) 
            VALUES (STANDARD_LINK_ID,  LINK_ROW.CORPID);
          ELSE
            INSERT INTO TABLEB(LINK_ID, LINK_NAME, URL, CORP_ID) 
            VALUES (SEQ_LINK.NEXTVAL, LINK_ROW.LINKTEXT, LINK_ROW.LINKURL, 
                                 LINK_ROW.CORP_ID);
          END IF;                 
      END LOOP;
    COMMIT;
END;

我看到它是这样做的;但条件中没有嵌入返回值的select


我怀疑你的if声明是罪魁祸首,因为你试图实现的目标肯定是可能的。请你尝试以下内容:

DECLARE 
STANDARD_LINK_ID TABLEB.LINK_ID%type;
URL_COUNT NUMBER(10);

BEGIN   
      FOR LINK_ROW IN ( SELECT LINKTEXT, LINKURL, CORPID FROM OLD_DATA)
      LOOP
          SELECT COUNT(URL) INTO URL_COUNT FROM TABLEA WHERE URL = LINK_ROW.LINKURL;
          IF URL_COUNT = 1 THEN
            SELECT LINKID INTO STANDARD_LINK_ID FROM TABLEA WHERE URL = LINK_ROW.URL;
            INSERT INTO TABLEB(LINK_ID, CORP_ID) 
            VALUES (STANDARD_LINK_ID,  LINK_ROW.CORPID);
          ELSE
            INSERT INTO TABLEB(LINK_ID, LINK_NAME, URL, CORP_ID) 
            VALUES (SEQ_LINK.NEXTVAL, LINK_ROW.LINKTEXT, LINK_ROW.LINKURL, 
                                 LINK_ROW.CORP_ID);
          END IF;                 
      END LOOP;
    COMMIT;
END;

希望它能帮助您找出问题所在。

我写得很快,但我认为这两个查询将在不使用循环的情况下解决您的问题(比一次性插入慢):


注:别忘了
中的
表c

现在我来自一个不同的世界,但如果在我的世界里,集合运算要比循环快得多。我不知道这对oracle是否也是正确的,所以请随时告诉我,我认为SQL世界中的
循环
是一种邪恶,特别是当有办法的时候使用一次命中多条记录的结果集(如本例中所示)。+1我同意性能和避免循环通常是一件好事。在本例中,查询只用于复制数据一次,因此令人欣慰的是,性能不是问题
DECLARE 
STANDARD_LINK_ID TABLEB.LINK_ID%type;
URL_COUNT NUMBER(10);

BEGIN   
      FOR LINK_ROW IN ( SELECT LINKTEXT, LINKURL, CORPID FROM OLD_DATA)
      LOOP
          SELECT COUNT(URL) INTO URL_COUNT FROM TABLEA WHERE URL = LINK_ROW.LINKURL;
          IF URL_COUNT = 1 THEN
            SELECT LINKID INTO STANDARD_LINK_ID FROM TABLEA WHERE URL = LINK_ROW.URL;
            INSERT INTO TABLEB(LINK_ID, CORP_ID) 
            VALUES (STANDARD_LINK_ID,  LINK_ROW.CORPID);
          ELSE
            INSERT INTO TABLEB(LINK_ID, LINK_NAME, URL, CORP_ID) 
            VALUES (SEQ_LINK.NEXTVAL, LINK_ROW.LINKTEXT, LINK_ROW.LINKURL, 
                                 LINK_ROW.CORP_ID);
          END IF;                 
      END LOOP;
    COMMIT;
END;
-- insert to tableb when exists in tablea
insert into tableb(link_id, corp_id) 
select a.linkid, o.corpid
from old_data o
join tablea a on o.url = a.url


-- insert to tablec when not exists in tablea
insert into tablec(link_id, link_name, url, corp_id) 
select seq_link.nextval, o.linktext, o.linkurl, o.corp_id
from old_data o
where not exists(select 1 from tablea a where o.url = a.url)