如果表B中的数据与表A不同,则使用来自表A的数据填充表B.

时间:2016-01-28 12:39:13

标签: sql database oracle select sql-insert

对令人困惑的标题和长篇大论的帖子采取行动。

我正在尝试使用数据填充(Oracle)SQL表,以便我可以定期监视它并构建一个用户使用哪些应用程序模块的图片。

我有一张桌子' forms_sessions_log'其创建如下:

create table stuman.forms_sessions_log as (
select a.sid, a.serial#, a.logon_time, a.client_identifier,
a.module,a.username, a.SCHEMANAME, b.SPRIDEN_LAST_NAME, b.SPRIDEN_FIRST_NAME
from gv$session a, spriden b
where program like 'frmweb%'
and a.username=b.spriden_id)

这会创建一个'快照' '形式'在那个时间点连接到数据库的会话。

从那时起,通过作业调度程序每分钟,我想继续使用任何新的或不同的会话填充此表。

我想出了以下内容:

INSERT INTO stuman.forms_sessions_log
(sid,serial#,logon_time,client_identifier,module,username,SCHEMANAME,SPRIDEN_LAST_NAME,SPRIDEN_FIRST_NAME)
SELECT  a.sid, 
        a.serial#, 
        a.logon_time, 
        a.client_identifier, 
        a.module , 
        a.username, 
        a.SCHEMANAME, 
        b.SPRIDEN_LAST_NAME, 
        b.SPRIDEN_FIRST_NAME
FROM    gv$session a 
        spriden b
WHERE       a.PROGRAM like 'frmweb%'
AND         a.username=b.spriden_id         
AND         NOT EXISTS(SELECT * FROM stuman.forms_sessions_log)
/

这似乎不起作用。它无法添加任何新会话。如果我截断stuman.forms_sessions_log并再次运行insert语句,它会填充正常,但在连续尝试时无法向表中添加任何新会话。

我查看了代码并决定使用NOT EXISTS子句中的比较来微调语句。

INSERT INTO stuman.forms_sessions_log
  (sid,serial#,logon_time,client_identifier,module,username,SCHEMANAME,SPRIDEN_LAST_NAME,SPRIDEN_FIRST_NAME)
SELECT  a.sid, 
    a.serial#, 
    a.logon_time, 
    a.client_identifier, 
    a.module , 
    a.username, 
    a.SCHEMANAME, 
    b.SPRIDEN_LAST_NAME, 
    b.SPRIDEN_FIRST_NAME
FROM    gv$session a, 
        spriden b
WHERE       a.PROGRAM like 'frmweb%'
AND         a.username=b.spriden_id         
AND         NOT EXISTS(SELECT     a.sid,a.serial#,a.logon_time,a.client_identifier,a.module,a.username,a.SCHEMANAME 
            FROM stuman.forms_sessions_log a, 
                 gv$session b
        WHERE   a.sid=b.sid 
        AND     a.serial#=b.serial#
        AND     a.logon_time=b.logon_time
        AND     a.client_identifier=b.client_identifier
        AND     a.module=b.module 
        AND     a.username=b.username
        AND     a.SCHEMANAME=b.SCHEMANAME
                )
/

这也不能达到我的预期。我隔离了我想检查的查询的NOT EXISTS部分:

SELECT     a.sid,a.serial#,a.logon_time,a.client_identifier,a.module,a.username,a.SCHEMANAME 
            FROM stuman.forms_sessions_log a, 
                 gv$session b
        WHERE   a.sid=b.sid 
        AND     a.serial#=b.serial#
        AND     a.logon_time=b.logon_time
        AND     a.client_identifier=b.client_identifier
        AND     a.module=b.module 
        AND     a.username=b.username
        AND     a.SCHEMANAME=b.SCHEMANAME

现在,请记住,表A和表B中的那些已定义字段是相同的(stuman.forms_session_log是从gv $ session填充的),没有任何返回。

我有一行stuman.forms_session_log,它对应于gv $ session中的一行。

为什么上面的select语句没有返回任何结果?

1 个答案:

答案 0 :(得分:1)

您是否尝试过使用MERGE?

MERGE INTO stuman.forms_sessions_log sl
USING (SELECT  a.sid, 
               a.serial#, 
               a.logon_time, 
               a.client_identifier, 
               a.module , 
               a.username, 
               a.SCHEMANAME, 
               b.SPRIDEN_LAST_NAME, 
               b.SPRIDEN_FIRST_NAME
       FROM    gv$session a, 
               spriden b
      WHERE    a.PROGRAM like 'frmweb%'
        AND    a.username=b.spriden_id  ) S
ON (    S.sid = SL.sid 
    AND S.serial# = sl.serial#)
WHEN NOT MATCHED THEN INSERT (sid,serial#,logon_time,client_identifier,module,username,SCHEMANAME,SPRIDEN_LAST_NAME,SPRIDEN_FIRST_NAME)
  VALUES (S.*)