ORA-00905:合并语句中缺少关键字

时间:2017-04-06 10:40:51

标签: sql database oracle

我正在为大学练习编写一小段代码,但我无法让它发挥作用。只有当Anagrafica的行没有空字段时,我才想加入Cod上的Impiegato和Anagrafica行。然后,对于新临时表的每一行,我生成一个字符串(some_string),该字符串将是ReportImpiegato表中Report字段的值。我使用的是Oracle 11g和SQL Developer。提前感谢愿意提供帮助的每个人。 : - )

我的表是:

TABLE IMPIEGATO
COD NUMBER(4,0)
NOME    VARCHAR2(40 BYTE)
COGNOME VARCHAR2(40 BYTE)
DATA_ASSUNTO    DATE
STIPENDIO   NUMBER(8,2)
CAPO    NUMBER(4,0)

TABLE ANAGRAFICA
COD NUMBER(4,0)
DATAN   DATE
SESSO   CHAR(1 BYTE)
LUOGON  VARCHAR2(80 BYTE)
PROVN   CHAR(2 BYTE)

TABLE REPORTIMPIEGATO
COD NUMBER
REPORT  VARCHAR2(4000 BYTE)

我的代码是:

MERGE INTO ReportImpiegato R
USING (SELECT * FROM (
    (SELECT *
    FROM Anagrafica A
    WHERE (A.DATAN IS NOT NULL AND A.LUOGON IS NOT NULL AND A.PROVN IS NOT NULL AND A.SESSO IS NOT NULL)) A 
    JOIN
    (Impiegato I)
    ON (A.Cod = I.Cod)
  )) D
ON (R.Cod = D.Cod)
WHEN MATCHED THEN
    UPDATE SET R.Report = some_string
WHEN NOT MATCHED
    INSERT (Cod, Report) VALUES (D.Cod, some_string)

输出是:

Error starting at line : 1 in command -
MERGE INTO ReportImpiegato R
USING (SELECT * FROM (
        (SELECT * FROM Anagrafica A WHERE (A.DATAN IS NOT NULL AND A.LUOGON IS     NOT NULL AND A.PROVN IS NOT NULL AND A.SESSO IS NOT NULL)) A 
        JOIN
        (Impiegato I)
        ON (A.Cod = I.Cod)
      )) D
ON (R.Cod = D.Cod)
WHEN MATCHED THEN
    UPDATE SET R.Report = some_string
WHEN NOT MATCHED
    INSERT (Cod, Report) VALUES (D.Cod, some_string);
Error at Command Line : 14 Column : 5
Error report -
SQL Error: ORA-00905: missing keyword
00905. 00000 -  "missing keyword"
*Cause:    
*Action:

1 个答案:

答案 0 :(得分:1)

错误消息指向出现问题的行和字符。如果我运行的代码是在实际报告的问题中发布的(12,5),那就是INSERT

您在错误的分支上错过了THEN

...
WHEN NOT MATCHED THEN    --- THEN was missing!
    INSERT (Cod, Report) VALUES (D.Cod, some_string)

后续ORA-00904: "D"."COD": invalid identifier是因为您在select *子句中执行了using。如果你在它上面运行那个子查询,你最终会得到名为CODCOD_1的列,至少在SQL Developer中,除了来自两个连接表的所有其他列名之外;但它取决于客户。在合并中,似乎做了不同的事情。如果你这样做

MERGE INTO ReportImpiegato R
USING (SELECT A.COD FROM (

即。只选择你真正需要的列,这个问题就会消失。

(我不知道some_string应该来自哪里;它可能是您真实代码中的字面值。)