如何使用同一表中现有记录的相同数据更新记录多个列。
例如:
id name m_value
1 moh 1000
2 jo 0
我希望id =2
的记录更新为id =1
数据之后应该是这样的:
id name m_value
1 moh 1000
2 moh 1000
答案 0 :(得分:1)
请提供您的表格名称 - 当相关表格的名称未知时,无法写出令人满意的答案。如果没有更好的信息,您的表格为AnonymousTable
。
您需要一个子查询:
UPDATE AnonymousTable
SET (name, m_value) = ((SELECT name, m_value
FROM AnonymousTable
WHERE id = 1
))
WHERE id = 2;
这里的关键技巧是双括号。当您使用符号SET(a, b, c) = (v1, v2, v3)
时,您需要在=
符号的每一侧使用一组括号。使用子选择生成值列表时,请将其括在括号中。因此,当您设置列列表并使用子查询时,您需要双括号。
您几乎肯定需要主UPDATE语句的条件以及子查询中的条件,如图所示。如果没有id = 1
的行,那么你将分配空值,除非你在name
或m_value
上有NOT NULL约束 - 如果它们在那里,应该是,那么更新将失败,这很好。
请注意,没有'除了...之外的所有列'的简写,所以如果表格中有30列,则必须在LHS中列出其中的29个(除了id
之外的所有列)设置并再次在子选择的选择列表中。
DROP TABLE IF EXISTS AnonymousTable;
CREATE TEMP TABLE AnonymousTable
(
id INTEGER NOT NULL,
NAME CHAR(10) NOT NULL,
m_value CHAR(10) NOT NULL
);
INSERT INTO AnonymousTable VALUES(1, 'moh', '1000');
INSERT INTO AnonymousTable VALUES(2, 'jo', '0');
SELECT * FROM AnonymousTable;
UPDATE AnonymousTable
SET (NAME, m_value) = ((SELECT NAME, m_value
FROM AnonymousTable
WHERE id = 1
))
WHERE id = 2;
SELECT * FROM AnonymousTable;
输出:
1|moh|1000
2|jo|0
1|moh|1000
2|moh|1000
在Mac OS X 10.11.6上测试:Informix 12.10.FC6(SQLCMD 90.01,ESQL / C 4.10.FC6)。
一些非常旧版本的Informix可能会针对同一个表的子查询进行更新。你不应该真的使用这么旧的系统,但如果它失败了,那可能就是原因。
答案 1 :(得分:0)
Math.Truncate
此代码仅在" id" column设置为主键,否则它可能返回更多值,以查询异常结束。