2014-10-30 57 views
2

我有2個表:Table1和Table2。兩個表都有一個名爲Column2的列。使用另一個表記錄作爲WHERE參數更新一個表中的記錄

我想爲表2中不存在的所有記錄將Table1.Column1的所有值設置爲NULL。即所有記錄Table1.Column2 <> Table2.Column2。

這是我試圖執行查詢:

UPDATE a 
SET a.Column1 = null 
FROM Table1 a 
INNER JOIN Table2 b 
ON a.Column2 <> b.Column2 

我得到一個「令牌未知」動態SQL錯誤「FROM」當我試圖執行這個查詢。

任何想法我做錯了什麼?我對SQL相當陌生,所以很有可能我使用了錯誤的連接類型。

+0

Althought在這種情況下(如果不匹配設置爲null)是不可能的Firebird數據庫,在類似案件中人們可以使用[MERGE](HTTP:// WWW .firebirdsql.org/refdocs/langrefupd25-merge.html)聲明 – ghord 2016-07-12 08:38:00

回答

-1

這應該在火鳥工作。

UPDATE a 
SET a.Column1 = null 
FROM Table1 a 
LEFT OUTER JOIN Table2 b ON a.Column2 = b.Column2 
WHERE b.Column2 IS NULL 
+2

它不,Firebird不支持更新中的連接。 – 2014-11-01 08:21:39

3

火鳥不支持聯接在UPDATE -statements,而不是你需要做這樣的事情:

UPDATE Table1 
    SET Column1 = NULL 
WHERE NOT EXISTS (
    SELECT 1 
    FROM Table2 
    WHERE Table2.Column2 = Table1.Column2 
) 

然而,這似乎指向一個丟失的外鍵約束(從Table1Table2),這將強制執行此操作(或者如果在Table1中使用了Table2,則會刪除其中的記錄)。

1

您的需求不是很清楚,因爲您沒有提及Table1和Table2如何與Column2以外的其他鏈接關聯,所以我認爲這樣的列是加入的。您需要涉及的表被修改與查詢的別名,在某種程度上就像一個「光標」:

UPDATE Table1 ***Table1_0*** 
    SET Column1 = NULL 
WHERE 
(select Column2 from Table2 where (Column2 = ***Table1_0***.Column2) is null 

如果發現匹配,則條件將返回一個值和「爲空」部分將是錯誤的,並且該行將被註釋更新。

0

這肯定適用於火鳥2.5:

update CREATOR c 
set ALPHAINDEXID = 
(select ai.alphaindexid 
from ALPHAINDEX ai 
where ai.alphaindexletter = substring(c.creatorname from 1 for 1) 
and ai.roleid = 5) 
相關問題