我正在尝试更新表的子集中的一列但我无法弄清楚如何以干净有效的方式执行此操作。
请考虑以下事项:
// MyTable
id name flag
0 Steve 0
1 Bob 0
...
10500 Rick 0
我想将flag
更改为1,但仅限于某些情况。我试着用
UPDATE MyTable
SET flag = 1
WHERE id <= 500
但显然这不起作用,因为子查询返回多个值。从技术上讲,我可以这样做:
UPDATE MyTable SET flag = 1 WHERE id = 0
UPDATE MyTable SET flag = 1 WHERE id = 1
...
UPDATE MyTable SET flag = 1 WHERE id = 500
但谁愿意这样做呢? :)我有更好的方法来格式化这个查询,只更新那些与不等式相匹配的方法吗?
修改
要明确说明发生了什么:当我说'其中一些案例'时,我只是指那些与不平等相匹配的案件,在这种情况下id <= 500
当我运行UPDATE MyTable SET flag = 1 WHERE id <= 500
时,我收到以下错误:
Subquery returned more than 1 value.
This is not permitted when the subquery follows =, !=, <, <= , >, >=
or when the subquery is used as an expression.
答案 0 :(得分:8)
如果您的查询没有子查询,我会怀疑您在表上有一个不太好的触发器,它一次只能更新一条记录。这需要修复,因为不应该在此假设上写入任何触发器。 SQL Server中的触发器只需要执行基于集合的操作,因为它们对整个集合一次不是一行。
答案 1 :(得分:0)
这是条件查询的主要用例之一(使用where子句)。您需要一种方法来唯一标识要更改的行行,并根据标识信息构造查询。您的初始尝试适用于此概念,但是,您构建的表格非常通用,即使不是不可能,编写适当的查询以仅选择相关信息也很困难。也许尝试更改表以使数据更具体,最好是通过分区数据。例如,是否有某种方法对数据进行分组,以便某些人可以被识别为“学生”或“教授”等?究竟是什么标志指示?
答案 2 :(得分:0)
你的查询应该有效,如果它只是那个查询,它应该返回受影响的行数。
你写的长手确实完成了你的第一个查询。你在什么环境中运行它?