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

Posted

技术标签:

【中文标题】使用另一个表的记录作为 WHERE 参数更新一个表中的记录【英文标题】:Update records in one table using another table's records as WHERE parameters 【发布时间】:2014-12-26 15:43:00 【问题描述】:

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

对于 Table2 中不存在的所有记录,我想将 Table1.Column1 的所有值设置为 NULL。 IE。 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 还很陌生,所以很有可能我使用了错误的连接类型。

【问题讨论】:

虽然在这种情况下(不匹配时设置 null)在 firebird 数据库中是不可能的,在类似情况下可以使用MERGE 语句 【参考方案1】:

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

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

但是,这似乎表明缺少外键约束(从 Table1Table2),这将强制执行此操作(或者如果 Table2 中的记录在 @ 中使用,则不允许删除它们987654326@).

【讨论】:

【参考方案2】:

您的需求不是很清楚,因为除了 Column2 之外,您没有提到 Table1 和 Table2 是如何链接的,所以我假设这样的列是连接列。您需要在查询中使用别名修改表,有点像“光标”:

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

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

【讨论】:

【参考方案3】:

这绝对适用于 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)

【讨论】:

【参考方案4】:

这应该可以在 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 不支持加入更新。

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

SQL Dev:使用where语句从另一个表的列更新列

SQL Server更新表(用一张表的数据更新另一张表的数据)

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

使用来自另一个表的相应数据更新所有表记录

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

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