使用子查询更新 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
我有 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