如何使用现有记录的相同数据更新记录

时间:2016-07-26 10:06:44

标签: sql database sql-update informix

如何使用同一表中现有记录的相同数据更新记录多个列。

例如:

id  name  m_value

 1   moh   1000

 2   jo       0

我希望id =2的记录更新为id =1

的相同数据

数据之后应该是这样的:

id  name  m_value

 1   moh   1000

 2   moh   1000

2 个答案:

答案 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的行,那么你将分配空值,除非你在namem_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设置为主键,否则它可能返回更多值,以查询异常结束。