Informix は、JOIN を使用したその種の UPDATE をサポートしていません。UPDATE については、IBM Informix 11.70 InfoCenterの構文を参照してください。また、認識できない構文に遭遇すると、エラー -201 が発生します。
Informix が結合による更新をサポートしていない場合、どのようにテーブルを結合できますか? とにかく、後でこのクエリを Hibernate に変換する必要があります。
今から冬眠に入りたいのですが...つまり、クエリを解釈して、その方法を考えさせたいということですか? テーブルのスキーマ (主キー、外部キーは特に重要です!) がありませんか? 間違いなく Hibernate で修正する必要があります。私はそれを使用したことがありません。
これがあなたのクエリです。読みやすくするために再フォーマットされています。
UPDATE a
SET a.export_flag ='Y'
FROM sc_ob_temp_audit AS a
JOIN sc_ob_allocation AS b
ON a.sc_ob_profile_code = b.sc_ob_profile_code
AND a.sc_orig_country= b.sc_orig_country
LEFT JOIN sc_fac_group AS f
ON b.sc_orig_country = f.sc_orig_country
AND b.sc_orig_sf_group_code = f.sc_fac_group_code
LEFT JOIN sc_ob_prod_group AS d -- ON clause missing (but there was a comma here)
JOIN gbl_produce AS e
ON d.sc_prod_cont_code = e.gp_cnt_cd
AND b.sc_orig_country= d.sc_orig_country -- Part of missing ON clause?
AND b.sc_prod_cont_group_code = d.sc_prod_group_code -- Part of missing ON clause?
WHERE a.sc_orig_country ='MY'
AND a.export_flag='N';
訓練されていない私の目には、非常に複雑な書き方のように見えます。
UPDATE sc_ob_temp_audit
SET export_flag = 'Y'
WHERE sc_orig_country = 'MY'
AND export_flag = 'N'
ただし、おそらくすべての結合は何か有用であり、更新される行のセットを何らかの形で制限します。したがって、次のような意味であると推測できます。
UPDATE sc_ob_temp_audit
SET export_flag = 'Y'
WHERE sc_orig_country = 'MY'
AND export_flag = 'N'
AND sc_primary_key IN -- Guessed at column; no schema for the DB; no keys!
(SELECT a.sc_primary_key
FROM sc_ob_temp_audit AS a
JOIN sc_ob_allocation AS b
ON a.sc_ob_profile_code = b.sc_ob_profile_code
AND a.sc_orig_country = b.sc_orig_country
LEFT JOIN sc_fac_group AS f
ON b.sc_orig_country = f.sc_orig_country
AND b.sc_orig_sf_group_code = f.sc_fac_group_code
LEFT JOIN sc_ob_prod_group AS d
ON b.sc_orig_country = d.sc_orig_country
AND b.sc_prod_cont_group_code = d.sc_prod_group_code
JOIN gbl_produce AS e
ON d.sc_prod_cont_code = e.gp_cnt_cd
)
実際、テーブルに単一列の主キーがない場合は、sc_ob_temp_audit
代わりに EXISTS を使用した相関サブクエリを使用する必要があります。
UPDATE sc_ob_temp_audit
SET export_flag = 'Y'
WHERE sc_orig_country = 'MY'
AND export_flag = 'N'
AND EXISTS
(SELECT * -- It does not matter what you list here in an EXISTS sub-query
FROM sc_ob_temp_audit AS a
JOIN sc_ob_allocation AS b
ON a.sc_ob_profile_code = b.sc_ob_profile_code
AND a.sc_orig_country = b.sc_orig_country
LEFT JOIN sc_fac_group AS f
ON b.sc_orig_country = f.sc_orig_country
AND b.sc_orig_sf_group_code = f.sc_fac_group_code
LEFT JOIN sc_ob_prod_group AS d
ON b.sc_orig_country = d.sc_orig_country
AND b.sc_prod_cont_group_code = d.sc_prod_group_code
JOIN gbl_produce AS e
ON d.sc_prod_cont_code = e.gp_cnt_cd
WHERE a.pk_column1 = sc_ob_temp_audit.pk_column1
AND a.pk_column2 = sc_ob_temp_audit.pk_column2
AND ...
)
それはうまくいく可能性があると思います。サブクエリの WHERE 句を使用a
してサブクエリ内の監査テーブルを識別し、完全な名前を使用して UPDATE ステートメント内の監査テーブルを識別する必要があります。しかし、夜の時間を考えると、私が誤解している可能性があります。