标签: sql-merge

不使用源表进行合并 Oracle SQL Developer

我试图将数据合并到数据库中,但没有表就不能,我不想创建一个临时表,然后再删除

MERGE INTO target_table target
USING ('0101-2019' as date, 1515 as random_data, 9595 as more_random_data) source
ON (target.date= source.date) 
WHEN MATCHED THEN
    UPDATE  SET target.date = source.date,  
                    target.random_data = source.random_data, 
                    target.more_random_data = source.more_random_data
WHEN NOT MATCHED THEN
    INSERT  (date,  random_data, more_random_data)
    VALUES (source.date,  source.random_data, source.more_random_data);
Run Code Online (Sandbox Code Playgroud)

由于某种原因,如果我不使用 Oracle SQL Developer,我可以找到一种可行的方法,但我无法将其翻译为 Oracle

MERGE target_table AS target
USING   (VALUES ('0101-2019', 1515, 9595))
     AS source(date, random_data, more_random_data)
ON target.date= source.date
WHEN MATCHED THEN
    UPDATE  SET target.date = source.date,
                    target.random_data = source.random_data
                    target.more_random_data = source.more_random_data …
Run Code Online (Sandbox Code Playgroud)

oracle sql-merge

3
推荐指数
1
解决办法
1563
查看次数

ORA-38104: ON 子句中引用的列无法更新 c.emp_id

我有两张简单的桌子

CREATE TABLE employee (
  emp_id INT PRIMARY KEY,
  first_name VARCHAR(40),
  last_name VARCHAR(40),
  birth_day DATE,
  sex VARCHAR(1),
  salary INT,
  super_id INT,
  branch_id INT
);

CREATE TABLE biodata (
  emp_id INT PRIMARY KEY,
  first_name VARCHAR(40),
  last_name VARCHAR(40),
  birth_day DATE,
  sex VARCHAR(1)
);
Run Code Online (Sandbox Code Playgroud)

我想合并它

merge into biodata c
using employee e
on (c.emp_id = e.emp_id)
when matched then
  update set
  c.emp_id=e.emp_id,
  c.first_name=e.first_name,
  c.last_name=e.last_name,
  c.birth_day=e.birth_day,
  c.sex=e.sex
when not matched then
  insert VALUES(e.emp_id,e.first_name,e.last_name,e.birth_day,e.sex);
Run Code Online (Sandbox Code Playgroud)

但甲骨文说:

ORA-38104: ON 子句中引用的列无法更新: c.emp_id

sql oracle syntax-error sql-merge

3
推荐指数
1
解决办法
1543
查看次数

Oracle 上的大规模更新与合并性能

我正在尝试使用单个大量UPDATE语句从源表更新目标表,但执行时间比应有的时间长得多。

询问

UPDATE MY_DEST
SET (DEST_B, DEST_C) = (
  SELECT SRC_A + SRC_B, SRC_B
  FROM MY_SRC
  WHERE SRC_KEY = DEST_KEY AND SRC_DATE = DEST_DATE
);
Run Code Online (Sandbox Code Playgroud)

两个表都包含大约 10 到 1300 万行,它们具有匹配的主键,我们可以安全地假设目标表中的每一行在源表中都有对应的行。

表定义

CREATE TABLE MY_SRC (
  SRC_KEY VARCHAR2(50),
  SRC_DATE DATE,
  SRC_A NUMBER(15,2),
  SRC_B NUMBER(15,2),
  CONSTRAINT MY_SRC_PK PRIMARY KEY (SRC_KEY, SRC_DATE)
);

CREATE TABLE MY_DEST (
  DEST_KEY VARCHAR2(50),
  DEST_DATE DATE,
  DEST_B NUMBER(15,2),
  DEST_C NUMBER(15,2),
  CONSTRAINT MY_DEST_PK PRIMARY KEY (DEST_KEY, DEST_DATE)
);
Run Code Online (Sandbox Code Playgroud)

执行计划

Plan hash value: 3904754293

------------------------------------------------------------------------------------------
| Id  | …
Run Code Online (Sandbox Code Playgroud)

oracle query-optimization sql-update sql-merge oracle12c

3
推荐指数
1
解决办法
9914
查看次数

合并 PL/SQL 块中的两个表

我有接下来的 3 个表:

  • Fibonacci(id, value) 前 1000 个斐波那契数。
  • Prime(id, value) 前 2000 个素数。
  • FiboPrime(value, prime),最初表是空的。

我必须用斐波那契表中的质数填充 FiboPrime 表(质数=1 => 数字是质数,否则数字不是质数。)

我必须使用 MERGE 语句,它是尝试:

DECLARE

    BEGING
        MERGE INTO FiboPrime fp
         USING fibonacci f, prime p
         ON (f.value=p.value)
        WHEN MATCHED THEN
         UPDATE SET
          fp.value=f.value,
          fp.prime=1;
    WHEN NOT MATCHED THEN
     INSERT VALUES(f.value,0);
END;
Run Code Online (Sandbox Code Playgroud)

我收到下一个错误:当期望出现以下情况之一时,出现符号“INTO”: := .( @ ; not null range character。谁能帮我解决这个问题?

sql oracle plsql sql-merge

2
推荐指数
1
解决办法
4462
查看次数

根据公共ID组合两行

我有一个查询返回每行两行ID.我希望能够将这些合并为一行,基于ID.

每个只会有两行ID.如下例所示,一行只包含ColumnA,另一行包含ColumnB.

所以这是当前数据的简化版本:

在此输入图像描述

这就是我希望的样子,虽然我不完全确定如何去做:

在此输入图像描述

sql t-sql sql-merge sql-server-2012

2
推荐指数
1
解决办法
1013
查看次数

基本合并到同一张表

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

sql oracle sql-merge

1
推荐指数
1
解决办法
3万
查看次数

同一表的合并语句不会插入新行,而是更新 Oracle DB 中的现有行

我正在尝试使用MERGEOracle 12 DB 表上的语句执行 upsert 操作CONFIG,该表的架构如下所示:

id | name | value
Run Code Online (Sandbox Code Playgroud)

如果存在带有“NON_TAXABLE_CODE”的行name,请将其更新value为“400”,否则在其中插入新行。

第一次尝试

MERGE into CONFIG dest USING (SELECT id, name, value from CONFIG where name = 'NON_TAXABLE_CODE') src
    ON (dest.name = src.name)
WHEN MATCHED THEN
    UPDATE SET dest.value = src.value
WHEN NOT MATCHED THEN
    INSERT (id, name, value) VALUES (src.id, src.name, src.value )
Run Code Online (Sandbox Code Playgroud)

如果该行存在,这将更新该值,但不会插入新行(如果不存在行)

第二次尝试:

MERGE into CONFIG as dest USING VALUES (0, 'NON_TAXABLE_CODE', '400') as src (id, name, value)
    ON …
Run Code Online (Sandbox Code Playgroud)

sql database oracle sql-merge oracle12c

1
推荐指数
1
解决办法
639
查看次数