假设我有以下具有以下约束的表:
create table test as (
select 1 as id, 'a' as name from dual
union all
select 2, 'b' from dual
union all
select 3, 'c' from dual
);
create unique index ind on test(name);
alter table test add constraint constr unique (name);
select * from test;
ID NAME
---------- ----
1 a
2 b
3 c
Run Code Online (Sandbox Code Playgroud)
现在假设我执行以下操作MERGE:
merge into test t using (
select 4 as id, 'b' as name from dual
union all
select 2 …Run Code Online (Sandbox Code Playgroud) 我想写一个MERGE语句,通过使用ORDER BY子句从一个大表中选择TOP 10行,并更新它的一个列值.MERGE语句允许我选择TOP 10行,但我无法将ORDER BY子句放在任何地方.
MERGE TOP(10) StudentAllocation AS SA
USING (SELECT @sub_id AS subId) AS TSA ON SA.sub_id = TSA.subId
WHEN MATCHED THEN
UPDATE SET SA.exam_batch = 1);
Run Code Online (Sandbox Code Playgroud) 我正在使用Spring JDBC和oracle SQL.
使用SpringJDBC类MapSqlParameterSource,我已经映射了我想要合并的数据.
现在我想使用merge语句来更新/插入数据库表.我只有一个表和一堆我想要合并到它的参数.
merge into proj.person_registry pr
using ( ! parameters should go here somehow? )
on (pr.id = :id or pr.code = :code)
when matched then
update set pr.code = :code,
pr.name = :name,
pr.firstname = :firstname,
pr.cl_gender = :cl_gender,
pr.cl_status = :cl_status,
pr.aadress = :aadress,
pr.aadress_date = :aadress_date
when not matched then
insert values (:code, :name, :firstname, :cl_gender, :cl_status, ;aadress, :aadress_date);
Run Code Online (Sandbox Code Playgroud)
我是否必须以某种方式为using 关键字创建临时表,还是有另一种方式?我怎么会这样合并呢?
pr.id和pr.code也有两个唯一的键.有时参数:id为null,当发生这种情况时,我想根据pr.code匹配到:code来到达update语句.如果我的更新包含该行,它仍然可以工作:
update set pr.code = :code,
Run Code Online (Sandbox Code Playgroud) 在处理数十亿条记录以比较合并语句中的 NULL 时,哪种语句是完美或更好的。我尝试过 SET ANSI_NULLS OFF 但这在合并语句中不起作用。这是我的两种方法
ISNULL(SRCColumn,-11111) = ISNULL(DSTColumn, -11111)
Run Code Online (Sandbox Code Playgroud)
或者
SRCColumn = DSTColumn OR (SRCColumn IS NULL AND DSTColumn IS NULL)
Run Code Online (Sandbox Code Playgroud)
请告诉我是否有更好的方法来处理。因为我有大约 15 列需要比较。
我正在执行从 Teradata 到 Big query 的迁移。我遇到过在 USING 子句中包含 VALUES 的合并语句。
MERGE INTO department DL
USING VALUES
(
2,'ABC'
) AS V
(Run_Id, Country)
ON DL.department_id = V.Run_Id
WHEN MATCHED THEN
UPDATE SET
department_description = V.country
WHEN NOT MATCHED THEN
INSERT
(
V.Run_Id
, V.Country
curr
);
Run Code Online (Sandbox Code Playgroud)
谁能帮我找到它的 BigQuery 等效项。
我有一个MERGE语句,它给了我可怕的ORA-00904: invalid identifier错误消息.请注意,此处不存在"无效标识符"错误的典型问题 - 我没有尝试更新已加入的列,也没有拼错我的列名.我正在尝试使用Oracle伪列ORA_ROWSCN在USING条款的SELECT说法.
使用这些示例表,我尝试运行
MERGE INTO MY_MERGE_TABLE D
USING
(SELECT PRIMARY_KEY,
COALESCE (UPDATE_DT, CREATED_DT) update_dt,
ORA_ROWSCN AS rowscn
FROM MY_SOURCE_TABLE) S
ON (D.PRIMARY_KEY = S.PRIMARY_KEY)
WHEN MATCHED THEN
UPDATE SET D.update_dt = GREATEST(D.update_dt, S.update_dt),
D.rowscn = GREATEST(D.rowscn, S.rowscn)
WHEN NOT MATCHED THEN
INSERT (D.PRIMARY_KEY, D.UPDATE_DT, D.ROWSCN)
VALUES (S.PRIMARY_KEY, S.UPDATE_DT, S.ROWSCN);
Run Code Online (Sandbox Code Playgroud)
如果我从USING子句中删除伪列ora_rowscn,我不再收到错误消息,并且合并成功完成.
MERGE INTO MY_MERGE_TABLE D
USING
(SELECT PRIMARY_KEY,
COALESCE (UPDATE_DT, CREATED_DT) update_dt
FROM MY_SOURCE_TABLE) S
ON (D.PRIMARY_KEY = …Run Code Online (Sandbox Code Playgroud) MERGE DestinationTable AS D
USING @SourceTable AS S
ON D.Alternate_ID = S._ID
WHEN MATCHED AND
(
D.Candidate_ID <> S.Candidate_ID OR ISNULL(D.Vacancy_ID,'') <> S.Vacancy_ID
)
THEN
UPDATE SET
D.FName = S.FName,
D.Department = S.Department,
WHEN NOT MATCHED BY TARGET
THEN INSERT
(
Alternate_ID,
FName,
Department
)
VALUES
(
S.ID,
S.FName,
S.Department
)
WHEN NOT MATCHED BY SOURCE
--How to add a where clause to the delete statement here
THEN DELETE; --E.g WHERE D.Department <> 'HR'
Run Code Online (Sandbox Code Playgroud)
我正在使用上面的合并声明删除DestinationTable中的记录,如果它们已从源中删除
有没有人知道如何将一个WHERE条件添加到Delete语句?我想只从目标中删除,其中ColA等于特定的常量字符串.
sql ×4
oracle ×3
oracle11g ×2
sql-server ×2
bigquery-udf ×1
isnull ×1
spring ×1
sql-order-by ×1
t-sql ×1