【问题标题】:Convert Oracle SQL query to Azure SQL query将 Oracle SQL 查询转换为 Azure SQL 查询
【发布时间】:2020-09-01 22:18:07
【问题描述】:

我有一个相当长的 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-server oracle sql-update azure-sql-database sql-insert


    【解决方案1】:

    这个Oracle merge 查询只有一个WHEN NOT MATCHED 子句,没有WHEN MATCHED,所以基本上就是insertnot 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 statement,其语法与 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)
    

    【讨论】:

    • 感谢您的回答。关于原始 oracle sql 命令的问题。这是否意味着对于给定的:study_id,如果studies 表上不存在该 study_id,我将插入一行。是这样吗?
    • @JonathanHagen:是的,这就是您显示的 Oracle 查询所做的。
    • 谢谢!抱歉,还有一个问题……x.* 是什么意思?
    • @JonathanHagen:这与包含值的派生表有关,其别名为 x
    猜你喜欢
    • 2011-06-12
    • 2016-07-29
    • 1970-01-01
    • 2022-01-12
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    相关资源
    最近更新 更多