我试图将数据合并到数据库中,但没有表就不能,我不想创建一个临时表,然后再删除
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) 我有两张简单的桌子
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
我正在尝试使用单个大量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) 我有接下来的 3 个表:
我必须用斐波那契表中的质数填充 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。谁能帮我解决这个问题?
我有一个查询返回每行两行ID.我希望能够将这些合并为一行,基于ID.
每个只会有两行ID.如下例所示,一行只包含ColumnA,另一行包含ColumnB.
所以这是当前数据的简化版本:

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

我想要做的是将不同的版本插入/更新到产品表中。这是一个 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) 我正在尝试使用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-merge ×7
oracle ×6
sql ×5
oracle12c ×2
database ×1
plsql ×1
sql-update ×1
syntax-error ×1
t-sql ×1