使用子查询更新 table 适用于 mysql 但在 oracle 上出错

Update table with subquery works on mysql but error on oracle

我有 table 命名为 TABLE_A 看起来像这样:

ID    DATA    VALUE     LM
---------------------------------
1      7        9       NULL
2     10        5       NULL
3      4        7       NULL

这实际上不是我的 table,我用它来缩短我的问题。 现在我想用子查询更新 table_a 。 这是我的查询:

UPDATE TABLE_A,
(SELECT VALUE AS VAL FROM TABLE_A WHERE ID = 2) AS TEMP
SET TABLE_A.LM = TABLE_A.VALUE + TEMP.VAL
WHERE TABLE_A.ID = 1

此查询适用于 Mysql,但在 oracle 中出现错误:

[Err] ORA-00971: missing SET keyword

编辑:

这是我的 table [SDM_ABSENSI] :

PERIODE   TGL_IN       TGL_OUT          IN      OUT      LM     TL
------------------------------------------------------------------
20141011  11/01/2014   11/01/2014    08:00    17:00     NULL  NULL
20141012  12/01/2014   13/01/2014    22:00    07:30     NULL  NULL
20141013  13/01/2014   13/01/2014    08:00    17:00     NULL  NULL

我的查询:

UPDATE SDM_ABSENSI A
    (
    SELECT PERIODE, TGL_IN, TGL_OUT, IN, OUT,
        TO_DATE(TO_CHAR(TGL_IN,'YYYY-MM-DD')||' '||IN,'YYYY-MM-DD hh24:mi') AS MASUK,
        TO_DATE(TO_CHAR(TGL_OUT,'YYYY-MM-DD')||' '||OUT,'YYYY-MM-DD hh24:mi') AS KELUAR
    FROM SDM_ABSENSI
    WHERE SUBSTR(PERIODE,0,6) = '201410'
    )ABSEN
SET A.LM = (24*60) * (ABSEN.KELUAR - ABSEN.MASUK),
    A.TL = CASE WHEN (24*60) * (ABSEN.KELUAR - ABSEN.MASUK) < 0
           THEN 0 ELSE (24*60) * (ABSEN.KELUAR - ABSEN.MASUK)
           END
WHERE SUBSTR(A.PERIODE,0,6) = '201410'
AND A.PERIODE = ABSEN.PERIODE

我得到了错误:

[Err] ORA-00971: missing SET keyword

请帮忙, 提前致谢

我认为您不能在 Oracle 中编写这样的子查询。您应该检查 oracle 文档中定义的更新语句,此处 http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/update_statement.htm

话虽如此,你到底想在这里做什么?您要在什么条件下为 LM 列分配什么值?

在我看来,该查询看起来不太好。您正在尝试从 table_a 中存储的数据构建一个临时 table 并使用临时 table 中的值更新相同的 table_a... 但是如何?随着时间的最大值table?满足条件时与同一个寄存器的值?

老实说,我不明白该查询在 MySQL 中如何工作。

总而言之,您能否提供更多信息?

[EDIT] 刚刚看到问题中的修改。您可以从它所在的位置删除子查询并将其放在 where 语句中...

更新TABLE_A SET TABLE_A.LM = TABLE_A.VALUE + (SELECT VALUE AS VAL FROM TABLE_A WHERE ID = 2) 其中 TABLE_A.ID = 1

Oracle 不支持 Update from Join 语法。相反,您可以使用 Merge。试试这个。

MERGE
INTO    SDM_ABSENSI 
USING   (
        SELECT PERIODE, TGL_IN, TGL_OUT, IN, OUT,
               TO_DATE(To_char(TGL_IN,'YYYY-MM-DD')||' '||IN,'YYYY-MM-DD hh24:mi') AS MASUK,
               TO_DATE(TO_CHAR(TGL_OUT,'YYYY-MM-DD')||' '||OUT,'YYYY-MM-DD hh24:mi') AS KELUAR
           FROM SDM_ABSENSI
           WHERE SUBSTR(PERIODE,0,6) = '201410'
        ) ABSEN
ON      SDM_ABSENSI.PERIODE = ABSEN.PERIODE 
WHEN MATCHED THEN
UPDATE 
SET    SDM_ABSENSI.LM = ( 24 * 60 ) * ( ABSEN.KELUAR - ABSEN.MASUK ),
       SDM_ABSENSI.TL = CASE
                WHEN ( 24 * 60 ) * ( ABSEN.KELUAR - ABSEN.MASUK ) < 0 THEN 0
                ELSE ( 24 * 60 ) * ( ABSEN.KELUAR - ABSEN.MASUK )
              END