【问题标题】:basic MERGE into same table基本合并到同一张表中
【发布时间】:2013-06-13 21:54:31
【问题描述】:

我想要做的是将不同版本插入/更新到产品表中。这是一个 PL/SQL 块,我有一个保存版本号的变量。假设版本是 10。现在,我想使用合并语句为同一产品插入或更新版本 11 - 15。所以,我需要检查表中现有的产品和版本(我有 product_id)。我需要生成数字 11 到 15 并将其与 product_id 一起对照表进行检查。所以,我的问题是在 using 子句中 - 我需要使用包含 10 的临时变量生成版本号(11-15),并作为我的第二列(版本)补充。请根据我的要求更新我在下面的基本 MERGE 语句。谢谢。

MERGE INTO product a
USING (SELECT product_id,
              version_id/variable
         FROM product
        WHERE product_id = 1234
      ) b 
      ON (a.product_id = b.product_id AND a.version_id = b.version_id)
 WHEN MATCHED THEN
    [UPDATE product]
 WHEN NOT MATCHED THEN
    [INSERT INTO product]

【问题讨论】:

  • 确定是11-15的逻辑是什么?如果只是“高于 10 的值”,则使用 a.version_id > b.version_id

标签: sql oracle sql-merge


【解决方案1】:

选择的答案有点复杂,所以这里是我的答案合并到同一张表中

MERGE INTO YOUR_TABLE
USING DUAL
    ON ( USER_ID = '123' AND USER_NAME= 'itszaif') 
WHEN NOT MATCHED THEN
        INSERT ( USERS_ID, USER_NAME)
        VALUES ('123','itszaif');

该命令检查USER_IDUSER_NAME是否匹配,如果不匹配则插入。

【讨论】:

  • 这是一个很好的简单示例,因为如果您只使用一个表,则必须使用 select 1 from dual 并在 ON 中根据主键输入条件桌子。我更新了示例,请注意您无法更新主键字段,我正在更改我为示例编写的一些字段。
【解决方案2】:

您可以使用行生成器,例如这将为您的查询生成版本 ID 11 到 15,以便您的合并可以根据需要插入/更新它们:

MERGE INTO product a
USING (SELECT product.product_id,
              q.version_id
         FROM product
             ,(SELECT ROWNUM+10 version_id FROM dual CONNECT BY LEVEL <= 5) q
        WHERE product_id = 1234
      ) b 
ON (a.product_id = b.product_id AND a.version_id = b.version_id)
WHEN MATCHED THEN
  [UPDATE product]
WHEN NOT MATCHED THEN
  [INSERT INTO product]

【讨论】:

  • 问题:(SELECT product.product_id, q.version_id FROM product ,(SELECT ROWNUM+10 version_id FROM dual CONNECT BY LEVEL &lt;= 5) q WHERE product_id = 1234 ) b部分不能简化为(SELECT ROWNUM+10 version_id, '1234' product_id FROM dual CONNECT BY LEVEL &lt;= 5) b吗?
  • @bernardpaulus 你可以,但你会假设表中存在 product_id = 1234 的行(这可能是也可能不是真的)。此外,查询产品表意味着我们是否需要产品表中的其他列,它们可供我们使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2021-06-26
  • 2017-08-22
  • 1970-01-01
  • 2019-06-27
  • 1970-01-01
  • 2014-10-04
相关资源
最近更新 更多