2015-04-28 20 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與標識字段。

相關問題