如何使用带有 INNER JOIN 的 UPDATE 查询来更新表中的字段

问题描述 投票:0回答:2

我不断收到以下 SQL 语句的运行时错误:

UPDATE tbl_1 
INNER JOIN tbl_2 ON tbl_1.PersNo = tbl_2.PersNo 
SET tbl_1.Marked = 'N/A' 
WHERE NOT EXISTS (SELECT * FROM tbl_2 WHERE tbl_1.PersNo = tbl_2.PersNo)

我想我可能有一些语法落后,当表 2 中不存在 PersNo 时,我希望用“N/A”(字符串值)更新表 1 标记字段。

这一切都源于一个带有多个 SQL 语句的函数,这些语句允许我用“是”、“否”或“N/A”更新表 1 标记的字段。因此,如果有更简单的方法来做到这一点,我愿意接受建议。

简而言之,如果表 2 中存在 PersNo 并且类型(来自表 2)为“Summary”,则将表 1 标记字段更新为“Yes”,但如果类型(来自表 2)为“Full”,则更新表1 标记字段为“No”,且 PersNo 在表 2 中不存在,请更新表 1 标记字段为“N/A”。

sql sql-server sql-update inner-join not-exists
2个回答
4
投票

问题的一部分是 SQL Server 喜欢您在使用

FROM
JOIN
时使用表别名和
UPDATE
子句,并且
SET
位于表之前:

UPDATE t1
SET t1.Marked = 'N/A' 
FROM tbl_1 t1
INNER JOIN tbl_2 t2 ON t1.PersNo = t2.PersNo 
WHERE NOT EXISTS (SELECT * FROM tbl_2 WHERE t1.PersNo = tbl_2.PersNo)

这并不完全是带有 JOIN 的 UPDATES 的 ansi 标准,但我喜欢它,因为它可以轻松地首先编写 SELECT 查询,然后快速将其转换为 UPDATE。

但现在我们已经走到这一步了,逻辑似乎是错误的。如果

NOT EXISTS()
成功,则
JOIN
条件将不会匹配任何行,因此不会发生任何更改。对于这一部分,您需要更多地思考您要做什么。根据书面描述,我认为您想要这个:

UPDATE t1
SET t1.Marked = CASE WHEN t2.Type='Summary' THEN 'Yes'
                     WHEN t2.Type='Full' THEN 'No'
                     ELSE 'N/A' END 
FROM tbl_1 t1
LEFT JOIN tbl_2 t2 ON t1.PersNo = t2.PersNo 
    AND t2.Type IN ('Summary', 'Full')

这一切都源于一个包含多个 SQL 语句的 [procecdure],这些语句允许我用“Yes”、“No”或“N/A”更新表 1 标记的字段。因此,如果有更简单的方法来做到这一点,我愿意接受建议。

我敢打赌,可以将所有或大部分步骤合并到一个查询中,该查询将在一小部分时间内执行相同的工作,但为了帮助实现这一点,我们必须查看整个过程。


1
投票

您的语法对于 SQL Server 来说确实不正确 - if我理解您的最后一段,您只需要一个条件 case 表达式。如果以下内容(当然未经测试)不正确,希望它足以让您走上正轨:

update t1 set t1.Marked =
    case t2.type
      when 'Summary' then 'Yes'
      when 'Full' then 'No'
      else 'N/A'
    end
from tbl_1 t1
left join tbl_2 t2 on t1.PersNo = t2.PersNo;
© www.soinside.com 2019 - 2024. All rights reserved.