【问题标题】:Oracle -- WITH CLAUSE => MERGE? (Syntax error, )甲骨文——带子句 => 合并? (语法错误,)
【发布时间】:2011-10-04 04:00:18
【问题描述】:

我正在尝试让 WITH 子句与 Oracle 中的合并一起使用,但由于某种原因,我无法使其正常工作。我敢肯定这是显而易见的,但我只是没见过。

-- behold, the wonders of fake data
WITH X AS ( 
SELECT 
  'moo' AS COW, 
  'woof' AS CAT, 
  (SELECT MAX( DECIBELS ) FROM ANIMALIA WHERE COW = 'moo' ) AS DECIBELS
FROM DUAL )
MERGE INTO ANIMALIA D 
USING X
WHEN MATCHED THEN
    UPDATE SET D.COW = X.COW;

编辑

我实际上发现了如何解决这个问题(在我提交问题之前),但我认为由于我花了很长时间才找到答案,希望留下这个问题意味着下一个人会找到它没那么多时间。

我会在一天左右发布答案,但如果其他人在此期间发布答案,他们将获得积分。

【问题讨论】:

  • ORA-00928:缺少 SELECT 关键字
  • 其实子查询最终和问题没有任何关系。
  • @OMG 我可以回答这个问题并将其标记为这样,但如果有人知道,他们可能会欣赏这些观点,你知道吗? (对这个话题有什么想法吗?)
  • @OMG 如果你愿意,我可以发给你。

标签: oracle merge with-statement ora-00928 subquery-factoring


【解决方案1】:

只能在 SELECT 语句中使用 WITH 子句。 See the documentation here.:

您可以在任何顶级 SELECT 语句和 大多数类型的子查询。

所以,你可以做这样的事情(11g 测试):

MERGE INTO animalia d
USING (WITH X AS 
       (SELECT  'moo' AS COW, 'woof' AS CAT, 
                (SELECT MAX( DECIBELS ) 
                   FROM ANIMALIA 
                  WHERE COW = 'moo' ) AS DECIBELS
          FROM DUAL )
       SELECT * FROM X) q ON (1 = 1)
 WHEN MATCHED THEN UPDATE SET d.cow = q.cow||' and more';

【讨论】:

  • 谢谢。快乐点。我的解决方案是USING (SELECT... ) X ON,但我认为两者都做同样的事情。
  • 当然,我认为练习是在 MERGE 语句中使用 WITH 子句;-)
  • 老实说,一旦我开始使用它,我就不太在乎了,但我真的很高兴我们有两种语法(给下一个人)
  • 但是你仍然不能在WHEN MATCHED THEN DELETE 中使用源代码内联视图:(
猜你喜欢
  • 2019-01-30
  • 2011-08-29
  • 2018-02-23
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多