【问题标题】:merge sql condition is null issue合并sql条件为空问题
【发布时间】:2019-04-15 12:08:39
【问题描述】:

我有两个非常相似的 SQL 语句。其中一个工作,一个不工作。 SQL 错误消息似乎具有误导性。你能猜出来吗?

SQL 1 -- 这很好用

    Merge into   t1 
    Using ( 
        Select art_ref_nr, channel, some_value From s1 ) t2
    On ( t1.art_ref_nr = t2.art_ref_nr and t1.channel = t2.channel
        and ( t1.datasource is null
            or (t1.datasource = 'no such value' ) -- only null values will be found
        ))
    WHEN MATCHED THEN UPDATE SET
        t1.some_value = t2.some_value
    ,   t1.datasource = 'value 1'
    ;

SQL 2 -- 失败

    Merge into   t1 
    Using ( 
        Select art_ref_nr, channel, some_value From s1 ) t2
    On ( t1.art_ref_nr = t2.art_ref_nr and t1.channel = t2.channel
        and ( t1.datasource is null
       ))
    WHEN MATCHED THEN UPDATE SET
        t1.some_value = t2.some_value
    ,   t1.datasource = 'value 2'
    ;

SQL1 运行良好。 SQL2 消息:

不能更新 ON 子句中引用的列:字符串 原因: UPDATE SET 的 LHS 包含 ON 子句中引用的列

另一方面,我在两个 SQL 中都引用了 on 子句“数据源”,因此错误消息不能完全正确。

问题似乎是有一次我只检查空值条目。但是为什么这会影响 SQL 逻辑呢?

许多问候, 彼得

【问题讨论】:

  • 它是一个预言机数据库

标签: sql oracle null sql-merge


【解决方案1】:

我的猜测是您的第一个查询不会产生错误,因为从未找到匹配的行。

对于第二个查询,它必须执行 UPDATE,但不能因为您将要 UPDATE 的列引用到 ON 子句中。

要克服这个问题,请尝试进入 WHERE 子句,ON 子句的部分引用您尝试更新的列:

Merge into   t1 
Using ( 
    Select art_ref_nr, channel, some_value From s1 ) t2
On (t1.art_ref_nr = t2.art_ref_nr and t1.channel = t2.channel)
WHEN MATCHED THEN UPDATE SET
    t1.some_value = t2.some_value
,   t1.datasource = 'value 2'
WHERE t1.datasource is null
;

【讨论】:

  • 嗨,Thomas,我的第一个 SQL 实际上更新了一些列,即那些具有空值的列。
  • @PeterFrey 它的工作原理可能与 NULL 有关。您是否尝试过我的第二个查询的解决方法?
  • 您的解决方案给了我与我的 SQL1 相同(积极)的结果。所以这里没问题。我仍然不明白为什么我的 SQL1 可以工作。有什么想法吗?
  • 最后我认为这是蟾蜍有一段时间没有被关闭的问题......我标记你的答案以关闭问题
猜你喜欢
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-15
  • 2013-05-11
  • 1970-01-01
相关资源
最近更新 更多