需要编写带有条件的查询

Posted

技术标签:

【中文标题】需要编写带有条件的查询【英文标题】: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插入新行 【参考方案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 只更新。然后单独插入。

以上是关于需要编写带有条件的查询的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch:以更简单的方式编写具有逻辑条件的 Elasticsearch 查询 - query_string

sql 存储过程带有模糊查询条件

带有 where 条件的 PL/SQL 更新查询作为带有一些空值的选择查询

是否可以在单个查询中编写两个具有两个条件的 UPDATE 函数?

带有可能缺少某些搜索条件的查询的 Oracle 存储过程

带有 VB.net 变量字符串条件的动态 SQL 查询