Sql 使用另一个表更新一个表中的记录';s记录为WHERE参数

Sql 使用另一个表更新一个表中的记录';s记录为WHERE参数,sql,sql-update,inner-join,firebird,firebird2.5,Sql,Sql Update,Inner Join,Firebird,Firebird2.5,我有两张桌子:表一和表二。两个表都有一个名为Column2的列 对于表2中不存在的所有记录,我想将Table1.Column1的所有值设置为NULL。即表1.Column2表2.Column2中的所有记录 这是我正在尝试执行的查询: UPDATE a SET a.Column1 = null FROM Table1 a INNER JOIN Table2 b ON a.Column2 <> b.Column2 更新a 设置a.Column1=null 来自表1 a 内连接表2b 在

我有两张桌子:表一和表二。两个表都有一个名为Column2的列

对于表2中不存在的所有记录,我想将Table1.Column1的所有值设置为NULL。即表1.Column2表2.Column2中的所有记录

这是我正在尝试执行的查询:

UPDATE a
SET a.Column1 = null
FROM Table1 a
INNER JOIN Table2 b
ON a.Column2 <> b.Column2
更新a
设置a.Column1=null
来自表1 a
内连接表2b
在a.Column2上b.Column2
当我尝试执行此查询时,在“FROM”上出现“Token Unknown”动态SQL错误


知道我做错了什么吗?我对SQL相当陌生,因此很有可能使用了错误的联接类型。

这在Firebird中应该适用

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

Firebird不支持
UPDATE
-语句中的联接,相反,您需要执行以下操作:

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

但是,这似乎表明缺少外键约束(从
Table1
Table2
),这将强制执行此约束(或者如果
Table1
中使用了
Table2
中的记录,则不允许删除这些记录).

您的需求不是很清楚,因为您没有提到表1和表2是如何链接的,而不是列2,所以我假设这样的列就是连接列。您需要在查询中使用别名修改表,就像“游标”:


如果找到匹配项,则条件将返回一个值,“is null”部分将为false,并且行注释将被更新

这肯定适用于Firebird 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)

它不支持,Firebird不支持更新中的连接。虽然在这种情况下(不匹配时设置null)在Firebird数据库中不可能,但在类似的情况下,可以使用语句
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)