使用另一个表的记录作为WHERE参数更新一个表中的记录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用另一个表的记录作为WHERE参数更新一个表中的记录相关的知识,希望对你有一定的参考价值。

我有2个表:Table1和Table2。两个表都有一个名为Column2的列。

我想将Table1.Column1的所有值设置为NULL,以用于Table2中不存在的所有记录。即Table1.Column2 <> Table2.Column2的所有记录。

这是我试图执行的查询:

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

当我尝试执行此查询时,我在“FROM”上收到“令牌未知”动态SQL错误。

知道我做错了什么吗?我对SQL很新,所以我很有可能使用错误的连接类型。

答案

Firebird不支持UPDATE语句中的连接,而是需要执行以下操作:

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

然而,这似乎指向缺少外键约束(从Table1Table2),这将强制执行(或者如果在Table2中使用Table1中的记录将被删除)。

另一答案

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

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

如果找到匹配项,则条件将返回一个值,“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。

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

以上是关于使用另一个表的记录作为WHERE参数更新一个表中的记录的主要内容,如果未能解决你的问题,请参考以下文章

使用另一个表中的数据更新一个表的记录

从另一个表的多条记录更新一个表中的一条记录。其中一个表的列名是另一个表的字段

如何获取另一个表中不存在的表的记录?

根据另一个表中的值插入和/或更新记录

根据另一个表中的记录更新SQL记录

怎么根据一个表的字段值修改另一个表的字段值