2013-02-18 79 views
0

我想從你的所有關於我的sql語句中得到關於Infomix的幫助。請在下面找到我的代碼。我加入5個表並使用主鍵鏈接。我需要的是,我必須根據export_flag='N'country='MA'將export_flag列更新爲Y.更新informix中的查詢語句

但現在我打這樣的

13時34分12秒語法錯誤[更新 - 0行(S),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'; 
+0

- > OUTER JOIN sc_ob_prod_group AS d,JOIN gbl_produce AS e – 2013-02-18 05:50:03

回答

3

的Informix不支持那種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語句中標識審計表。但是,考慮到晚上的時間,我有可能錯誤思考。

+0

他也使用'OUTER JOIN'而不指定是否是'LEFT','RIGHT'或'FULL'外部連接。 – 2013-02-18 06:27:48

+0

如果通用符號得到支持,這將是一個問題;它不是,所以沒關係。 – 2013-02-18 06:32:04

+0

我猜想只有'UPDATE(SELECT ... query-with-join ...)x SET x.export_flag ='Y''語法被支持,對嗎? – 2013-02-18 06:34:26