0

の sql ステートメントに関して、皆さんから助けを求めたいとInfomix思います。以下のコードを見つけてください。5 つのテーブルを結合し、主キーにリンクしています。私が必要とするのは、に基づいて export_flag 列を Y に更新する必要があることexport_flag='N'ですcountry='MA'

しかし、今、私はこのような構文エラーにぶつかっています

13:34:12 [UPDATE - 0 行、0.000 秒] [エラー コード: -201、SQL 状態: 42000] 構文エラーが発生しました。

SQL のどこに問題があるのか​​ わかりませんでした。

    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
    OUTER 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
    OUTER JOIN sc_ob_prod_group AS d, JOIN gbl_produce AS e 
    ON d.sc_prod_cont_code = e.gp_cnt_cd
    AND b.sc_orig_country= d.sc_orig_country
    AND b.sc_prod_cont_group_code = d.sc_prod_group_code
    WHERE a.sc_orig_country ='MY'
    AND a.export_flag='N';
4

1 に答える 1

3

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 ステートメント内の監査テーブルを識別する必要があります。しかし、夜の時間を考えると、私が誤解している可能性があります。

于 2013-02-18T06:16:06.713 に答える