2011-02-10 121 views
1

此MS SQL Server語句我需要幫助運行在Informix上此MS SQL Server的UPDATE語句(11版):需要幫助運行在Informix上

update b 
set Colname = 'StringValue' 
from Table1 b right join Table1 c 
on ((b.Col1 = c.Col1) and (b.Col2 = c.Col2)) 
where ((b.Col3 = 'S' and b.Col4 <> 'S') and (c.Col3 = 'Z' and c.Col4 <> 'S')) 

我不斷收到錯誤號-201(語法錯誤)。

你能看到任何語法錯誤嗎?有任何想法嗎?

回答

1

您正在使用哪個版本的Informix?

實際上,我認爲它不重要... IDS不支持UPDATE聲明中的連接符號,即使在最新版本中也是如此。所以,問題在於你正在嘗試使用DBMS不支持的符號,因此你可以回到討厭的(但在這種情況下是準確的)通用的「-201:發生語法錯誤」。我不認爲即使最新的GA版本IDS 11.70.xC1也支持UPDATE語句中的表別名(這會使查詢變得複雜)。

我承認RIGHT {self} JOIN讓我感到困惑 - 我不確定我明白它應該如何工作。然而,這裏是一箇中等逼近請求的更新:

UPDATE Table1 
    SET Colname = 'StringValue' 
WHERE Table1.Col3 = 'S' 
    AND Table1.Col4 <> 'S' 
    AND EXISTS(SELECT * FROM Table1 AS C 
       WHERE C.Col1 = Table1.Col1 AND C.Col2 = Table1.Col2 
       AND C.Col3 = 'Z' 
       AND C.Col4 <> 'S' 
      ) 

的嘮叨懷疑有兩方面:

  • 將IDS歧義的,以表1中引用EXISTS子查詢是否正確?
  • RIGHT JOIN是什麼意思?

不幸的是,在運行查詢時,我得到的結果:

SQL -360: Cannot modify table or view used in subquery. 

有針對的解決方法,使用臨時表,但他們是一個麻煩。然而,這個示例代碼似乎按照我的期望工作(因爲我仍然無法將自己的大腦包圍在原來的RIGHT JOIN中)。

CREATE TABLE table1 
(
    col1 INTEGER NOT NULL, 
    col2 INTEGER NOT NULL, 
    col3 CHAR(1) NOT NULL, 
    col4 CHAR(1) NOT NULL, 
    colname VARCHAR(32) NOT NULL 
); 

-- The first row shown is updated - the others are unchanged 
INSERT INTO table1 VALUES(1, 1, 'S', 'A', 'Old value'); 
INSERT INTO table1 VALUES(1, 1, 'Z', 'A', 'Old value'); 
INSERT INTO table1 VALUES(1, 2, 'S', 'A', 'Old value'); 
INSERT INTO table1 VALUES(1, 2, 'Z', 'S', 'Old value'); 
INSERT INTO table1 VALUES(1, 3, 'S', 'S', 'Old value'); 
INSERT INTO table1 VALUES(1, 3, 'Z', 'S', 'Old value'); 
INSERT INTO table1 VALUES(1, 4, 'S', 'S', 'Old value'); 
INSERT INTO table1 VALUES(1, 4, 'Z', 'A', 'Old value');  

SELECT * FROM Table1 WHERE Col3 = 'Z' AND Col4 <> 'S' INTO TEMP C; 

UPDATE Table1 
    SET Colname = 'StringValue' 
WHERE Table1.Col3 = 'S' 
    AND Table1.Col4 <> 'S' 
    AND EXISTS(SELECT * FROM {Table1 AS} C 
       WHERE C.Col1 = Table1.Col1 AND C.Col2 = Table1.Col2 
       AND C.Col3 = 'Z' 
       AND C.Col4 <> 'S' 
      ); 

片段'{Table1 AS}'是在Informix中的註釋。由於創建臨時表C的方式,Col3和Col4上的條件並非嚴格必要。

結果我從SELECT * FROM Table1 ORDER BY Col1, Col2, Col3, Col4得到前和UPDATE語句後有:

Before 
1 1 S A Old value 
1 1 Z A Old value 
1 2 S A Old value 
1 2 Z S Old value 
1 3 S S Old value 
1 3 Z S Old value 
1 4 S S Old value 
1 4 Z A Old value 

After 
1 1 S A StringValue 
1 1 Z A Old value 
1 2 S A Old value 
1 2 Z S Old value 
1 3 S S Old value 
1 3 Z S Old value 
1 4 S S Old value 
1 4 Z A Old value 
+0

我要當我試圖寫它運行在informix的9和11的腳本,它可以用別名來工作,但更新使用連接會引發錯誤。使用EXIST子查詢是做到這一點的最好方法,爲什麼我試圖用無情的合作來解決這個問題!謝謝喬納森。 – CloudyMarble 2011-02-10 15:10:16