iT邦幫忙

1

SQL 同一資料表中,大量更新?

單一筆的更新可以用Update。
UPDATE "表格名"
SET "欄位1" = [新值]
WHERE {條件}

那如果要大量的呢?如:
編號 名稱
1 小明
2 小華
3 小亮
4 小冰
5 小端
改成↓
1 小明
2 華華
3 亮亮
4 冰冰
5 小端

要用什麼方法可以一次修改呢? 匯入可以嗎?
謝謝。

雖然這種需求很奇怪
以下還是建議兩種做法當做參考

1.DELETE then DEFINE
1.A)下SQL刪除那一萬多筆資料(把原來的 SELECT 改成 DELETE 即可, WHERE 不變)
1.B)將EXCEL中的一萬多筆資料匯入SQL中(使用SQL預設的管理功能即可)

2.UPDATE 原資料
2.A)使用EXCEL中的資料組成SQL指令(組成方式類以這種公式="UPDATE MYTABLE SET MYFIELD='" & A2 & " WHERE KEY='" & B2 & "'")
2.B)將整坨SQL指令丟進SQL執行
外獅佬 iT邦大師 1 級 ‧ 2009-07-31 09:04:47 檢舉
^^b
25
外獅佬
iT邦大師 1 級 ‧ 2009-07-30 17:53:56
最佳解答
<pre class="c" name="code">UPDATE <表格> SET <欄位>=(SUBSTR(TRIM(<欄位>),2,1)+SUBSTR(TRIM(<欄位>),2,1)) WHERE <欄位> NOT IN("小明","小端")

這樣,就會達到題目上的效果....

看更多先前的回應...收起先前的回應...
qek9qek9 iT邦新手 3 級 ‧ 2009-07-30 18:00:24 檢舉

謝謝,不過…
但其實這資料表裡總共有4萬多筆,要改的筆數有1萬多筆,
我是把要改的已經用select挑出來,存在excel了。
有沒有匯入的方法? 還是可以更新成select挑出來的結果。
謝謝。

qek9qek9 iT邦新手 3 級 ‧ 2009-07-30 18:02:50 檢舉

我確時是要新值,不過如果我想要把數出來的新值取代舊的值呢?
請問有辦法這樣做嗎?

外獅佬 iT邦大師 1 級 ‧ 2009-07-30 22:01:36 檢舉

您要更新的資料,有沒有個相通的計算方式??
例如依您的題目, 我使用的解法就是...把符合條件的,『小』字替換成第二個字...
如果可以找出這個共通的邏輯...應該就很容易下手了。

匯入...可以先把資料匯入到一個新的資料表。
然後把舊的資料表中的資料刪除(刪除名單中的資料),然後使用INSERT INTO (SELECT...)的方式,把剛剛匯入的資料,填入舊的資料表。
最後,再把剛剛匯入那個暫存資料表刪除。

建議可以先備份資料,實際實驗一下。

外獅佬 iT邦大師 1 級 ‧ 2009-07-31 00:13:11 檢舉

呵呵...albert a chen都出手了....
請高手幫你解惑吧~~

外獅佬 iT邦大師 1 級 ‧ 2009-07-31 00:33:53 檢舉

albert高手出招....小弟...退~~

24
Albert
iT邦高手 1 級 ‧ 2009-07-31 00:03:56

編號 OldName NewName
1 小明 小明
2 小華 華華
3 小亮 亮亮
4 小冰 冰冰
5 小端 小端
4 萬筆不算多 台灣人口 2300萬人...
我們交易資料 每月最少幾萬筆
UPDATE MasterTable m
SET m.Name = (SELECT x.NewName FROM ReplaceTable x WHERE m.Name = x.OldName)
WHERE EXISTS (SELECT * FROM ReplaceTable y WHERE y.NewName <> y.OldName AND y.OldName = m.Name)

看更多先前的回應...收起先前的回應...
外獅佬 iT邦大師 1 級 ‧ 2009-07-31 00:22:15 檢舉

albert啊....
我想...誠心建議您....
好好了解別人的需求吧....2300萬筆資料...
基本上不是問題....
我想...您應該有很好的解法...︿︿..加油~

Albert iT邦高手 1 級 ‧ 2009-07-31 11:12:17 檢舉

我想...誠心建議您....
好好了解別人的需求吧??

UPDATE MasterTable m
SET m.Name = (SELECT x.NewName FROM ReplaceTable x WHERE m.Name = x.OldName)
WHERE EXISTS (SELECT * FROM ReplaceTable y WHERE y.NewName <> y.OldName AND y.OldName = m.Name)

外獅佬 iT邦大師 1 級 ‧ 2009-07-31 12:29:27 檢舉

不好意思~~有所冒犯,見諒見諒~~

qek9qek9 iT邦新手 3 級 ‧ 2009-07-31 15:39:07 檢舉

照這個解法是要先有一個放新資料TABLE,然後再比對做更新對吧。
我知道了,謝謝。

22
pantc328
iT邦研究生 1 級 ‧ 2009-07-31 08:35:21

4萬多筆?40萬筆?4000萬筆,其實是一樣的.
只要下幾次SQL語法,一次幾千筆,幾萬筆的改.不用二個小時就OK了.
SQL語法要簡潔,SQL Book OnLine 要多看.實例多做.
你這一題很基本,但我不想替你解.
你線上Book 將 SELECT 讀通.再將 UPDATE讀熟.妳就有辦法大量修改了.

qek9qek9 iT邦新手 3 級 ‧ 2009-07-31 15:40:33 檢舉

謝謝,我會繼續充實的。

10
smallbear
iT邦新手 5 級 ‧ 2009-08-01 12:31:00

使用參考其他資料表的方式, 就可以一次更新大量的不規則值
我的回答以不具規則性的資料來說明:

通常更新不具有規則性的資料時, 會建立另外一個暫時的資料表
欄位會加入原資料表的唯一鍵(or 唯一組合鍵)
假設原資料表 Member 的欄位是
<ID>,<Name>,<NickName>,<Phone>,<Address>
其中<ID>為唯一鍵
想更新的欄位有 <NickName>,<Address>
你可以把你 SELECT 出來要改的 Excel 表格改成以下欄位格式的資料
<ID>,<NickName>,<Address>
然後用資料匯入工具把 Excel 資料匯入成新的資料表 MemberUpdateInfo
然後使用比對的更新的 UPDATE 語法

&lt;pre class="c" name="code">
-- 更新時可以使用 UPDATE {Table1}..SET..FROM {Table2} WHERE ..
-- UPDATE 在此時應該是不能使用別名 Alias 

UPDATE Member
   SET NickName = MemberUpdateInfo.NickName
      ,Address  = MemberUpdateInfo.Address
  FROM MemberUpdateInfo
 WHERE ID = MemberUpdateInfo.ID

-- 丟棄暫時的資料表
DROP MemberUpdateInfo

我要發表回答

立即登入回答