使用多个表中的条件更新一组值

时间:2019-08-15 22:56:29

标签: sql sql-server

给出了我要查询的一组特定的行,我想将每个行的“ ifSpeed”值更新为静态值1000000000。

我创建了一个查询来查找需要更新该值的所有特定行,但是由于要使用的标记位于单独的表中,因此必须联接两个表以获取该信息。

我创建了一个查询来查找需要更新该值的所有特定行,但是由于要使用的标记位于单独的表中,因此必须联接两个表以获取该信息。该查询是第一段代码。第二个是我更新值的尝试之一。我也研究过子查询,但是我的SQL一直很生疏,因为我从事SQL已有8年了。

SELECT ifSpeed

FROM master_dev.device_interfaces AS MDDI

JOIN master_dev.device_interface_tags_map AS MDDITM
       ON MDDI.if_id = MDDITM.if_id

WHERE ifSpeed=10000000
       AND MDDITM.tag_id=13




UPDATE master_dev.device_interfaces

SET ifSpeed = '1000000000'

FROM master_dev.device_interfaces AS MDDI

JOIN master_dev.device_interface_tags_map AS MDDITM
       ON MDDI.if_id = MDDITM.if_id
WHERE ifSpeed=10000000
       AND MDDITM.tag_id=13

我希望我的SELECT查询中存在的所有行的ifSpeed更新为1000000000。

实际发生的只是一个错误。我正在使用受限制的接口来查询数据库,它仅提供受影响的行,行中的数据或简单地显示“ ERROR”。非常有帮助...我知道。

3 个答案:

答案 0 :(得分:0)

SSMS中尝试以下

----更新---

UPDATE MDDI
SET ifSpeed = '1000000000'
FROM master_dev.dbo.device_interfaces AS MDDI
JOIN master_dev.dbo.device_interface_tags_map AS MDDITM
  ON MDDI.if_id = MDDITM.if_id
WHERE ifSpeed = 10000000
AND MDDITM.tag_id = 13

答案 1 :(得分:0)

具有UPDATE子句的FROM的语法非常繁琐。幸运的是,在SQL Server中有更好的方法。

在这种情况下,我通常使用CTE(公共表表达式),这使得查询非常容易编写和读取,并验证查询是否按预期工作。

因此,您拥有复杂的SELECT语句,该语句返回要更新的所有行。很好。

SELECT ifSpeed
FROM 
    master_dev.device_interfaces AS MDDI
    JOIN master_dev.device_interface_tags_map AS MDDITM
        ON MDDI.if_id = MDDITM.if_id
WHERE
    ifSpeed=10000000
    AND MDDITM.tag_id=13
;

现在,将其包装到CTE中并更新CTE:

WITH
CTE
AS
(
    SELECT ifSpeed
    FROM 
        master_dev.device_interfaces AS MDDI
        JOIN master_dev.device_interface_tags_map AS MDDITM
            ON MDDI.if_id = MDDITM.if_id
    WHERE
        ifSpeed=10000000
        AND MDDITM.tag_id=13
)
UPDATE CTE
SET ifSpeed = '1000000000'
;

在执行实际更新以确认您选择的行正确之前,您可以写SELECT * FROM CTE代替行UPDATE CTE SET ...

答案 2 :(得分:0)

感谢您的所有投入!不幸的是,我有两个不同的团队给我两个不同的答案。虽然我应该能够在进一步提升链条之后做到这一点,但后端的工程团队却竖起了一堵砖墙,说不要冒险使用DB表。这个决定使我感到困惑,但这是基于受影响的因素,而不是我想让我想的那样。

话虽这么说,但他们确实让我知道原始代码很好,同样,maSTAShuFu提供了变体。

@Vladimir-对不起,您不能尝试使用它,但是我绝对会把它放在我的后兜里。谢谢!