16

我试图让 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;

编辑

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

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

4

1 回答 1

31

除了在 SELECT 语句中,您不能在任何地方使用 WITH 子句。 请参阅此处的文档。

您可以在任何顶级 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';
于 2011-07-13T04:03:35.470 回答