討論區快速選單
知識庫快速選單
掌握Salesforce雲端管理秘訣 討論區最近新進100則主題 政府補助!學嵌入式+物聯網
[ 回上頁 ] [ 討論區發言規則 ]
在sql中如何比對多筆資料後才insert,update
更改我的閱讀文章字型大小
作者 : nullt(nu)
[ 貼文 11 | 人氣 3290 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/9/20 下午 07:19:25
請問各位大大們:
我有一個問題,如何才能在SQL中解決。
在SQL中有2個不同的TALBE,一個命名為 ACCOUNT1.欄位為UID1(CHAR,10),EMONEY1 (INT,4)
另一為ACCOUNT2欄位為UID2(CHAR,10),,EMONEY2(INT,4)
ACCOUNT1中約有20萬筆資料,

我要的結果是,先將select ACCOUNT1中UID1在ACCOUNT2中UID2是不是存在
如果不存在就新增一筆到ACCOUNT2,
如果存在就UPDATE ACCOUNT2的相關欄位。

因為資料筆數較多,不論是用ASP或是VB都花費了相當多的時間,請問各位大大們
此問題可否用SQL的語法來解決。
作者 : williamliao(william)
[ 貼文 145 | 人氣 687 | 評價 1250 | 評價/貼文 8.62 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人nullt註記此篇回應為很有道理 2004/9/21 上午 01:07:59

方法很多......我就稍微點到為止!
你可以:

1.使用兩個批次,一個批次用 Update 另外一個用 Insert ... Select 的方式來達成。

2.在預存程序中使用 cursor

3.先刪除 ACCOUNT2 中和 ACCOUNT1 重複的資料,再把資料由 ACCOUNT1 複製到 ACCOUNT2。
作者 : nullt(nu)
[ 貼文 11 | 人氣 3290 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/9/21 上午 03:11:54
感謝william的回覆:
針對所提示的第一點:使用兩個批次,一個批次用 Update 另外一個用 Insert ... Select 的方式來達成是可以理解的,但有其它更好之方法嗎?

可否針對提示的第二點加以說明,小弟沒有用過store procedure 中用過cursor。

而第三點的方式,可能無法解決我的問題。
可將ACCOUNT2想成是記錄客戶存放銀行存款,而ACCOUNT1是每天分行之客戶存入銀行之金額。如果存入金額在ACCOUNT2存在的話那就去修改它該有的金額,如果不存在ACCOUNT2時,則新增該客戶資料。
(如先刪除 ACCOUNT2 中和 ACCOUNT1 重複的資料,再把資料由 ACCOUNT1 複製到 ACCOUNT2時,會將刪除重複資料則無法解決我的問題。 )
作者 : williamliao(william)
[ 貼文 145 | 人氣 687 | 評價 1250 | 評價/貼文 8.62 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人nullt註記此篇回應為很有道理 2004/9/21 下午 07:14:50

關於 Cursor 的使用大致如下
     -- 宣告指標
     Declare [CursorName] Cursor [CursorType] For
Select [Column1],[Column2],... From ACCOUNT1 Where ...
     -- 開啟指標
     Open [CursorName]

     -- 提取下一筆指標
     Fetch Next From [CursorName] Into @P1, @P2, ...

     While @@FETCH_STATUS = 0
     Begin
     If Exists(Select * From ACCOUNT2 Where ...)
     Begin
     -- Update 資料

     End
     Else
     Begin
     -- Insert 資料

     End
     Fetch Next From [CursorName] Into @P1, @P2, ...
     End

     -- 關閉指標
     Close [CursorName]
     -- 移除釋放指標
     Deallocate [CursorName]

詳細參考資料可以查閱 SQL Server 線上叢書!
作者 : nullt(nu)
[ 貼文 11 | 人氣 3290 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/9/21 下午 11:55:49
我由sql上的說明文件試著將它寫成如下
其資料內容如下

Col001 Col002 UID RaminBonus
------------------- --------------------------
陳大明 1000 張三 2542
王小華 1321 王老五 121
張三 3241 " "
   " " " "
   " " " "
------------------- --------------------------

DECLARE @uid VARCHAR(50),@account int,@uid2 VARCHAR(50),@account2

int,@cnt int
DECLARE import_cursor CURSOR FOR SELECT Col001, Col002 FROM import
DECLARE bonus_Cursor CURSOR FOR SELECT UID, RaminBonus FROM bonus

OPEN import_Cursor
FETCH NEXT FROM import_cursor INTO @uid,@account
WHILE(@@FETCH_STATUS=0)
BEGIN
OPEN bonus_Cursor
WHILE(@@FETCH_STATUS=0)
FETCH NEXT FROM bonus_Cursor INTO @uid2, @account2
BEGIN

select @cnt = count(*) from bonus where uid=@uid
select @account2= RaminBonus from bonus where uid=@uid



IF @cnt = 0
INSERT INTO bonus (UID, RaminBonus) VALUES (@uid,@account)
ELSE

UPDATE bonus SET RaminBonus =@account+@account2 where
uid=@uid
FETCH NEXT FROM bonus_Cursor INTO @uid2, @account2


END
CLOSE bonus_Cursor
FETCH NEXT FROM import_cursor INTO @uid,@account

END

CLOSE import_Cursor
DEALLOCATE bonus_Cursor
DEALLOCATE import_Cursor

但它執行的速度有點慢,問題應該是出在那裡,希望各位大大家幫幫忙...謝謝
作者 : williamliao(william)
[ 貼文 145 | 人氣 687 | 評價 1250 | 評價/貼文 8.62 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/9/22 下午 05:53:43

語法可以再調校,
內迴圈是多餘的,
盡量改成上一篇的架構!
作者 : nullt(nu)
[ 貼文 11 | 人氣 3290 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/9/22 下午 11:51:09
先謝謝您了....我在試試看。
感謝了
 板主 : 徵求中
 > SQL Server 7/2000 - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - SQL Server 7/2000 - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
SQL Server 7/2000
1 小朱 1540 
2 小台 1520 
3 Gordon 600 
4 ㄉ一ˊㄎㄜˋ 580 
5 路人 490 
6 max 470 
7 william 410 
8 Aries 250 
9 阿利 180 
10 羅啟章 160 
SQL Server 7/2000
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.0625