346

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';
4

15 に答える 15

476

その構文は Oracle では有効ではありません。あなたはこれを行うことができます:

UPDATE table1 SET table1.value = (SELECT table2.CODE
                                  FROM table2 
                                  WHERE table1.value = table2.DESC)
WHERE table1.UPDATETYPE='blah'
AND EXISTS (SELECT table2.CODE
            FROM table2 
            WHERE table1.value = table2.DESC);

または、これを行うことができるかもしれません

UPDATE 
(SELECT table1.value as OLD, table2.CODE as NEW
 FROM table1
 INNER JOIN table2
 ON table1.value = table2.DESC
 WHERE table1.UPDATETYPE='blah'
) t
SET t.OLD = t.NEW

インライン ビューが Oracle によって更新可能であると見なされるかどうかによって異なります (2 番目のステートメントで更新可能であるかどうかは、 ここにリストされているいくつかの規則によって異なります)。

于 2010-03-15T11:53:02.883 に答える
226

これを使って:

MERGE
INTO    table1 trg
USING   (
        SELECT  t1.rowid AS rid, t2.code
        FROM    table1 t1
        JOIN    table2 t2
        ON      table1.value = table2.DESC
        WHERE   table1.UPDATETYPE='blah'
        ) src
ON      (trg.rowid = src.rid)
WHEN MATCHED THEN UPDATE
    SET trg.value = code;
于 2010-03-15T11:58:30.100 に答える
35

MERGEWHERE句付き:

MERGE into table1
USING table2
ON (table1.id = table2.id)
WHEN MATCHED THEN UPDATE SET table1.startdate = table2.start_date
WHERE table1.startdate > table2.start_date;

WHERE句で参照される列はON更新できないため、この句が必要です。

于 2015-05-07T14:12:15.490 に答える
14
 UPDATE ( SELECT t1.value, t2.CODE
          FROM table1 t1
          INNER JOIN table2 t2 ON t1.Value = t2.DESC
          WHERE t1.UPDATETYPE='blah')
 SET t1.Value= t2.CODE
于 2010-03-15T11:58:12.410 に答える
7

hereに示されているように、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
                         )

これは、特に複数のフィールドを更新したい場合に興味深いと思います。

于 2016-01-14T12:37:44.580 に答える
3

それは正常に動作します

merge into table1 t1
using (select * from table2) t2
on (t1.empid = t2.empid)
when matched then update set t1.salary = t2.salary
于 2015-09-04T04:40:53.577 に答える
3

この次の構文は私にとってはうまくいきます。

UPDATE
(SELECT A.utl_id,
    b.utl1_id
    FROM trb_pi_joint A
    JOIN trb_tpr B
    ON A.tp_id=B.tp_id Where A.pij_type=2 and a.utl_id is null
)
SET utl_id=utl1_id;
于 2013-01-24T05:18:48.960 に答える
1

table2 に des の代わりにdescriptionを使用すると、

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'
;
于 2010-03-15T12:04:07.750 に答える
1
UPDATE table1 t1
SET t1.value = 
    (select t2.CODE from table2 t2 
     where t1.value = t2.DESC) 
WHERE t1.UPDATETYPE='blah';
于 2014-06-05T07:59:54.907 に答える
1
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 はエイリアス フィールドです。テーブルを指す必要はありません。

于 2017-05-30T09:47:58.800 に答える
0

Oracleベースには、これに関する優れた概要があります。

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

このリンクから - 上記のクエリの修正を使用しましたが、うまくいきませんでした (rowid を使用する mathguy からの回答)。

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 の 2 つのテーブルがあります。どちらにも共通の varchar フィールドがあり、ソース識別フィールド (PK) を dest テーブルに追加しています。

于 2020-11-09T13:51:43.313 に答える
-3
update table1  a 
   set a.col1='Y' 
 where exists(select 1 
                from table2 b
               where a.col1=b.col1 
                 and a.col2=b.col2
             )
于 2015-11-27T15:58:43.010 に答える