【问题标题】:Regarding sql query关于sql查询
【发布时间】:2010-07-02 12:20:50
【问题描述】:

我有下面的 sql 查询来插入表中的记录。问题是当没有用于选择查询的记录时,我仍然想要插入序列号、null、'3' 值的记录。当没有为选择查询找到记录时,不会插入任何内容。我该怎么做?

insert into test_details(seqnbr,trepid,type)
select '&seqid'
      ,REP_ID
      ,'3'
  FROM ref_details
 WHERE REP_ID >13;

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    一种方法是

    insert into test_details(seqnbr,trpid,type)
    select '&seqid',rep_id,'3' from ref_details where rep_id>13
    union all select '&seqid',null,'3'
    from dual where not exists(
    select 1 from ref_details where rep_id>13)
    

    【讨论】:

    • 这不会考虑差距
    【解决方案2】:

    Oracle 9i+:

    如需填补空白,需create a list of sequencial values

    INSERT INTO TEST_DETAILS
      (seqnbr, trpid, type)
     SELECT '&seqid', rd.rep_id, '3'
         FROM (SELECT LEVEL + 13
                 FROM DUAL
           CONNECT BY LEVEL <= 13) x
    LEFT JOIN REF_DETAILS rd ON rd.rep_id = x.level
                            AND rd.rep_id > 13
    

    ...然后 LEFT JOIN 到可能有间隙的表。

    【讨论】:

    • 你能告诉我更多关于级别什么是级别。
    • @Arav: LEVEL 是一个递增值,供 Oracle 用于递归查询的 CONNECT BY 语法中参考。该值将从 1 开始,因此查询添加 13 以从您在问题中指定的最小值开始。该链接提供了如何将上限设置为基于表值的示例...
    猜你喜欢
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    相关资源
    最近更新 更多