我有一个查询,在MySQL工作得很好,但当我在Oracle上运行它时,我得到以下错误:

SQL错误:ORA-00933: SQL命令未正确结束 00933. 00000 - "SQL命令未正确结束"

查询为:

UPDATE table1
INNER JOIN table2 ON table1.value = table2.DESC
SET table1.value = table2.CODE
WHERE table1.UPDATETYPE='blah';

当前回答

如这里所示,Tony Andrews提出的第一个解决方案的通用语法是:

update some_table s
set   (s.col1, s.col2) = (select x.col1, x.col2
                          from   other_table x
                          where  x.key_value = s.key_value
                         )
where exists             (select 1
                          from   other_table x
                          where  x.key_value = s.key_value
                         )

我认为这很有趣,特别是当你想要更新多个字段时。

其他回答

对table2使用description而不是desc,

update
  table1
set
  value = (select code from table2 where description = table1.value)
where
  exists (select 1 from table2 where description = table1.value)
  and
  table1.updatetype = 'blah'
;

甲骨文基地在这方面做得很好。

https://oracle-base.com/articles/misc/updates-based-on-queries

从这个链接-我使用了上述查询的修改,这对我来说没有作用(答案来自mathguy,它使用rowid)

MERGE /*+ APPEND PARALLEL(8) */ INTO dest_table tt
USING source_table st
ON (tt.identifier = st.identifier)
WHEN MATCHED THEN
  UPDATE SET tt.number = st.number;

这里我有两个表:source和dest,它们都有一个共同的varchar字段,我将源标识字段(PK)添加到dest表中。

UPDATE IP_ADMISSION_REQUEST ip1
SET IP1.WRIST_BAND_PRINT_STATUS=0
WHERE IP1.IP_ADM_REQ_ID        =
  (SELECT IP.IP_ADM_REQ_ID
  FROM IP_ADMISSION_REQUEST ip
  INNER JOIN VISIT v
  ON ip.ip_visit_id=v.visit_id
  AND v.pat_id     =3702
  ); `enter code here`

不要使用上面的一些答案。

有些人建议使用嵌套SELECT,不要这样做,它非常慢。如果你有很多记录要更新,使用join,就像这样:

update (select bonus 
        from employee_bonus b 
        inner join employees e on b.employee_id = e.employee_id 
        where e.bonus_eligible = 'N') t
set t.bonus = 0;

更多细节请参见此链接。 http://geekswithblogs.net/WillSmith/archive/2008/06/18/oracle-update-with-join-again.aspx。

另外,确保所有要连接的表上都有主键。

UPDATE (SELECT T.FIELD A, S.FIELD B
FROM TABLE_T T INNER JOIN TABLE_S S
ON T.ID = S.ID)
SET B = A;

A和B是别名字段,不需要指向表。