首页 > 解决方案 > 将 Oracle SQL 查询转换为 Azure SQL 查询

问题描述

我有一个相当长的 Oracle SQL 查询,需要与 Azure SQL 兼容。我对这两种数据库类型都很陌生。这是查询:

MERGE INTO studies
    USING dual
    ON (study_id = :study_id)
    WHEN NOT MATCHED THEN
        INSERT (study_id, study_date)
        VALUES (:study_id, :study_date)

我不确定USING dual会起作用。我读了一些解决方案,说这USING dual在 SQL Server 中是不必要的。

如果您能解释此查询的含义以及我如何将其翻译为 Azure SQL 查询,我将不胜感激。

标签: sql-serveroraclesql-updateazure-sql-databasesql-insert

解决方案


这个 Oraclemerge查询只有一个WHEN NOT MATCHED子句和 no WHEN MATCHED,所以基本上就是insertand not exists

insert into studies(study_id, study_date)
select x.*
from (values(@study_id, @study_date)) as x(study_id, study_date)
where not exists (select 1 from studies s1 where s1.study_id = x.study_id)

这在逻辑上等同于原始的 Oracle 查询。

至于您最初的问题:SQL Server 确实支持自己的风格或merge语句,其语法与 Oracle 不同。您可以将 Oracle 重写merge为:

merge studies as s
using (values(@study_id, @study_date)) as x(study_id, study_date)
on (s.study_id = x.study_id)
when not matched 
    then insert (study_id, study_date) values(x.study_id, x.study_date)

推荐阅读