给出了我要查询的一组特定的行,我想将每个行的“ 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”。非常有帮助...我知道。
答案 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-对不起,您不能尝试使用它,但是我绝对会把它放在我的后兜里。谢谢!