2015-04-28 23 views
11

我试图找出是否有办法更新记录而不必列出每个要更新的列名称。如何更新记录的所有列而不必列出每列

举例来说,这将是很好,如果我可以使用类似的东西:

// the parts inside braces are what I am trying to figure out 
UPDATE Employee 
SET {all columns, without listing each of them} 
WITH {this record with id of '111' from other table} 
WHERE employee_id = '100' 

如果可以做到这一点,这将是编写这样一个查询的最简单的/有效的方法?

+2

你怎么知道分配给每列的值? –

+0

我只是试图用新记录(id = 111)中的任何内容覆盖旧记录(id = 100)中的所有内容。因此,例如,即使没有列出像first_name,last_name这样的列名称,该查询也会按顺序比较每列,并使用不同的值覆盖所有列。那有意义吗? – BinaryCat

+1

没有切实可行的办法。您可以生成代码或执行删除 - 插入对。 99%的案例都不适用。 – usr

回答

12

这是不可能的。

你要做的不是SQL规范的一部分,也不受任何数据库供应商的支持。请参阅MySQL,Postgresql,MSSQL,Oracle,Firebird,Teradata的SQL UPDATE语句的规范。那些仅支持以下语法中的每一个:

UPDATE table_reference 
    SET column1 = {expression} [, column2 = {expression}] ... 
[WHERE ...] 
+0

是的,我花了几个小时研究解决方案,然后发布我的问题,认为可能有一些核心的方法来完成它只有专家知道。 – BinaryCat

0

,你可以通过删除表中的列,并加柱后面并添加任何你需要它是默认值做到这一点。然后保存这将需要重建表

0

如何使用合并?

https://technet.microsoft.com/en-us/library/bb522522(v=sql.105).aspx

它使您能够运行插入,更新和删除的能力。另一条建议是,如果您要使用索引更新大型数据集,并且源子集小于目标,但两个表都非常大,请首先将更改移至临时表。我试图合并两个表格,每个表格近200万行,20个记录需要22分钟。一旦我将deltas移到临时表中,它花了几秒钟。

0

这不是更多钞票,但..

可以DOIT:

begin tran 
delete from table where CONDITION 
insert into table select * from EqualDesingTabletoTable where CONDITION 
commit tran 

是carefoul与标识字段。

相关问题