使用另一个表的记录作为 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
)
但是,这似乎表明缺少外键约束(从 Table1
到 Table2
),这将强制执行此操作(或者如果 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 参数更新一个表中的记录的主要内容,如果未能解决你的问题,请参考以下文章