【问题标题】:Need to write Query with condition需要编写带有条件的查询
【发布时间】:2013-01-21 06:16:31
【问题描述】:

我需要编写一个查询

如果表中已经存在一条记录id,并且相同的记录id有一些不同的值是 然后我必须在表中更新其到期日期,并将具有新值的记录 id 插入到表中。 如果没有记录 id 不存在,则在表中创建一个新条目。

例如:在一个表中 tmp record_id =101 存在,然后更新所有记录 id='101' 的行的 main_table expiry_date 并从 tmp 插入一个新行到 main_table 否则插入到 main_table。

【问题讨论】:

  • 你有没有尝试过?请至少向我们展示表架构:)
  • 我尝试使用 Merge,但它无法同时正确地更新/插入。bcos 在任何情况下,我都需要使用记录 id 更新所有行的到期日期并插入新的 row.else插入新行

标签: sql oracle oracle10g oracle11g


【解决方案1】:

你需要一个Merge statement 和一个插入:

merge into your_table t
using(select 5 as id, sysdate as expiry_date from source where coditions) S
on(s.id = t.id)
when matched then update t.expiry_date = s.expiry_date;

insert into your_table t   
values (5 , sysdate);

【讨论】:

  • 匹配时,尽管正在更新,我也需要插入新行。Ur mising tat
  • :我们可以在匹配的两个 dml stmts 下写吗?
  • @Satheesh 正如我对 bonCodigo 所说,不。在Matched 上,您可以使用update where when not matched,您可以使用where 插入。
  • @FLORIN 那么还有其他选择吗?如果不合并一些 with 子句或其他选项
  • 看我的回答。合并这些 id,然后插入它们。如果该行不存在,则不会合并。但是,它将被插入到第二条语句中。
【解决方案2】:

请检查这个:

MERGE INTO mytable b
USING (SELECT * from mytable where id = 10) a
ON b.id = a.id
WHEN MATCHED THEN UPDATE SET b.expirydate = a.expirydate
;
INSERT (id, col1, col2...) VALUES (a.id, col1, col2...)

如果匹配,您将更新。任何时候你都会插入。

【讨论】:

  • merge statement 上没有那个选项(我指的是and insert
  • @FlorinGhita 我有一个错字,我的意思是说我们使用when matched 两次:) 为upsert
  • @Satheesh,这个怎么样,从逻辑上讲,它对我来说意义不大.. ;) 你可以试试看,匹配时你会做upsert(没有预言机matchine 试试这个)让我试试小提琴。
  • @FlorinGhita 我认为您的回答更有意义,因为 OP 无论如何都想插入。所以when matched 只更新。然后单独插入。
猜你喜欢
  • 2017-11-23
  • 2013-01-01
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-11
相关资源
最近更新 更多