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

How to use an UPDATE Query with an INNER JOIN to update fields within a table

我在以下 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)

我想我可能有一些语法倒退,我希望在 PersNo 不存在于 Table2.

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

简而言之,如果 PersNo 存在于 Table 2 中并且类型(来自 Table 2)是“Summary”,则更新 Table 1 标记字段为“是”,但是类型(来自 Table 2)是否为“完整”,然后更新 Table 1 标记为“否”的字段,并且 Table 中不存在 PersNo 2,更新 Table 1 用“N/A”标记的字段。

对于 SQL 服务器,您的语法确实不正确 - 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;

部分问题是 SQL 服务器希望您在使用带有 UPDATEJOIN 时使用 table 别名和 FROM 子句, SET 出现在 table 之前:

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 更新的 ansi 标准,但我喜欢它,因为它可以轻松地先编写 SELECT 查询,然后快速将其转换为更新。

但是现在我们已经走到这一步了,逻辑似乎是错误的。如果 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')

This all stems from a [procecdure] with several SQL statments that allow me to Update the Table 1 Marked field with either "Yes", "No", or "N/A". So if there is a simpler way to do this, I'm open to suggestions.

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