我不断收到以下 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 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 标记的字段。因此,如果有更简单的方法来做到这一点,我愿意接受建议。
我敢打赌,可以将所有或大部分步骤合并到一个查询中,该查询将在一小部分时间内执行相同的工作,但为了帮助实现这一点,我们必须查看整个过程。
您的语法对于 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;