11

これはInformixアップデートの正しい構文ですか?

update table1
set table1.code = 100
from table1 a, table2 b, table3 c
where a.key = c.key
a.no = b.no
a.key = c.key
a.code = 10
b.tor = 'THE'
a.group = 4183
a.no in ('1111','1331','1345')

一般的な-201「構文エラーが発生しました」というメッセージが表示されますが、何が問題なのかわかりません。

4

5 に答える 5

10

残念ながら、受け入れられた回答により、InformixDynamicServerバージョン11.50で構文エラーが発生します。

これは、構文エラーを回避する唯一の方法です。

update table1
set code = (
  select 100
  from table2 b, table3 c
  where table1.key = c.key
  and table1.no = b.no
  and table1.key = c.key
  and table1.code = 10
  and b.tor = 'THE'
  and table1.group = 4183
  and table1.no in ('1111','1331','1345')
)

ところで、Informixバージョンを取得するには、次のSQLを実行します。

select first 1 dbinfo("version", "full") from systables;

更新:この回答も参照してください。

更新:ドキュメントも参照してください。

于 2016-01-07T10:10:05.350 に答える
7

構文エラーはtable1.codeです

set table1.code = 100

これをに変更します

set a.code = 100

完全なコード

update table1
set a.code = 100
from table1 a, table2 b, table3 c
where a.key = c.key
and a.no = b.no
and a.key = c.key
and a.code = 10
and b.tor = 'THE'
and a.group = 4183
and a.no in ('1111','1331','1345')
于 2012-06-07T19:24:47.773 に答える
4

問題の元のSQLは次のとおりです。

update table1
set table1.code = 100
from table1 a, table2 b, table3 c
where a.key = c.key
a.no = b.no
a.key = c.key
a.code = 10
b.tor = 'THE'
a.group = 4183
a.no in ('1111','1331','1345')

これには、一連のANDキーワードが無条件に欠落しています。table1受け入れられた解決策は、エイリアスの代わりにを使用して、SET句の問題も識別しますa。それは重要かもしれません。テストできません(以下の説明を参照)。したがって、join UPDATEがまったく受け入れられると仮定すると、修正されたSQLは次のようになります。

UPDATE table1
   SET a.code = 100
  FROM table1 a, table2 b, table3 c
 WHERE a.key = c.key
   AND a.no = b.no
   AND a.key = c.key
   AND a.code = 10
   AND b.tor = 'THE'
   AND a.group = 4183
   AND a.no IN ('1111','1331','1345')

これは、(構文が修正された)受け入れられた回答と同じです。ただし、FROM構文(おそらくXPS?)を受け入れる使用しているInformixのバージョンを知りたいです。Mac OS X10.7.4でIDS11.70.FC2(現在の11.70.FC5バージョンの背後にある3つのフィックスパック)を使用していますが、FROM構文を使用したUPDATEを機能させることができません。さらに、IBMのInformix 11.70 Information Center for UPDATEのマニュアルには、それについては記載されていません。ODBCとJDBCのどちらを使用している場合でも、違いが生じるかどうかはわかりません。すべきではありませんが、SQLを変更せずにサーバーに送信するESQL/Cを使用しています。

私が試した表記は(+プロンプトです):

+ BEGIN;
+ CREATE TABLE a(a INTEGER NOT NULL, x CHAR(10) NOT NULL, y DATE NOT NULL);
+ INSERT INTO a(a, x, y) VALUES(1, 'obsoletely', '2012-04-01');
+ INSERT INTO a(a, x, y) VALUES(2, 'absolutely', '2012-06-01');
+ CREATE TABLE b(b INTEGER NOT NULL, p CHAR(10) NOT NULL, q DATE NOT NULL);
+ INSERT INTO b(b, p, q) VALUES(3, 'daemonic', '2012-07-01');
+ SELECT * FROM a;
1|obsoletely|2012-04-01
2|absolutely|2012-06-01
+ SELECT * FROM b;
3|daemonic|2012-07-01
+ SELECT *
  FROM a, b
  WHERE a.a < b.b
    AND b.p MATCHES '*a*e*';
1|obsoletely|2012-04-01|3|daemonic|2012-07-01
2|absolutely|2012-06-01|3|daemonic|2012-07-01
+ UPDATE a
  SET x = 'crumpet'
  FROM a, b
  WHERE a.a < b.b
    AND b.p MATCHES '*a*e*';
SQL -201: A syntax error has occurred.
SQLSTATE: 42000 at <<temp>>:23
+ SELECT * FROM a;
1|obsoletely|2012-04-01
2|absolutely|2012-06-01
+ ROLLBACK;
于 2012-06-12T15:08:46.033 に答える
3

使用しているバージョンによって異なります。少なくとも11.50を使用している場合、最良の解決策は次のとおりです。

MERGE INTO table1 as t1
USING table2 as t2
   ON t1.ID = t2.ID
WHEN MATCHED THEN UPDATE set (t1.col1, t1.col2) = (t2.col1, t2.col2);

UPDATE --SET --FROM --構文は、11.50以降のバージョンで削除されました。

以前のバージョンを使用している場合は、

UPDATE t SET a = t2.a FROM t, t2 WHERE t.b = t2.b;
于 2018-01-19T14:09:47.420 に答える
0

InformixSE7.25の場合...

  1. UPDATE ...FROM...構文が存在しません
  2. また、 Rockalliteの回答を使用するときに表示される「サブクエリで使用されるテーブルまたはビューを変更できません」

別の解決策は、それを2つのクエリに分割することです。

まず、必要なレコードのROWIDを取得します(複数のテーブルでフィルタリングされます)。

SELECT a.ROWID
  FROM table1 a, table2 b, table3 c
 WHERE a.key = c.key
   AND a.no = b.no
   AND a.key = c.key
   AND a.code = 10
   AND b.tor = 'THE'
   AND a.group = 4183
   AND a.no IN ('1111','1331','1345')

結果をコンマ区切りの文字列に入れます。

次に、最初のクエリでROWIDが見つかったメインテーブルのレコードのみを更新します。

UPDATE table1 a
   SET a.code = 100
WHERE a.ROWID in ([comma separated ROWIDs found above])
于 2018-01-09T15:05:01.093 に答える