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