線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1425
推到 Plurk!
推到 Facebook!

UPDATE 更新兩個資料表 續問

缺席
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-14 00:07:37 IP:61.71.xxx.xxx 未訂閱
請問各位! 延續上一個問題, 詳如下 http://delphi.ktop.com.tw/forum.asp?method2=mygood&forum_id=66 如果我的TABLEB是明細, TABLEA是主檔, 而主檔-明細(有多筆) 在這種情況下 update D8001 B set B.GROUPS = (select A.GROUPS from D8000 A where A.HEADNO = B.HEADNO and A.BODYNO = B.BODYNO) 會出現以下的錯誤訊息 multiple rows in singleton select 也就是主檔的GROUPS 對應到明細多個GROUPS是不被允許的, 請問是否在SQL上有解決的方式, 謝謝!
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-14 00:38:18 IP:220.132.xxx.xxx 未訂閱
Hi, 這個錯誤訊息是指你要更新的欄位值是多筆資料結果, 請先確認你的更新值子句傳回的不是多筆資料, 可以這樣下試看看, select B.GROUPS, (select A.GROUPS from D8000 A where A.HEADNO = B.HEADNO and A.BODYNO = B.BODYNO) as NEW_VALUE from D8001 B 看看是不是你的一個 B.GROUPS 對應了多個 NEW_VALUE. 這樣的 update 指令, 資料庫當然是無法更新的囉.
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-14 07:34:54 IP:61.71.xxx.xxx 未訂閱
引言: Hi, 這個錯誤訊息是指你要更新的欄位值是多筆資料結果, 請先確認你的更新值子句傳回的不是多筆資料, 可以這樣下試看看, select B.GROUPS, (select A.GROUPS from D8000 A where A.HEADNO = B.HEADNO and A.BODYNO = B.BODYNO) as NEW_VALUE from D8001 B 看看是不是你的一個 B.GROUPS 對應了多個 NEW_VALUE. 這樣的 update 指令, 資料庫當然是無法更新的囉.
感謝timhuang的提示, 不過就是因為TABLEA,B的對應是主檔-明細, 因為程式上的需要必須多加一個GROUPS欄位, 然後要把TABLEA 的GROUPS值填入到B中, 當然寫一支程式來轉換不用5分鐘, 只是我想瞭解這樣的情況是否SQL可以解決掉, 如果不行那也只好乖乖的寫程式 如附圖
pillar62
資深會員


發表:9
回覆:324
積分:271
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-14 10:46:02 IP:210.64.xxx.xxx 未訂閱
你好 如果確認在明細裡面的groupse在跟主檔對應的時候是一樣的話,可以用 update D8001 B set B.GROUPS = (select top 1 A.GROUPS from D8000 A where A.HEADNO = B.HEADNO and A.BODYNO = B.BODYNO)在mssql可以用這樣的方式!!試試看吧!! Pillar Wang
------
Pillar Wang
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-04-14 11:36:14 IP:61.71.xxx.xxx 未訂閱
引言: 你好 如果確認在明細裡面的groupse在跟主檔對應的時候是一樣的話,可以用 update D8001 B set B.GROUPS = (select top 1 A.GROUPS from D8000 A where A.HEADNO = B.HEADNO and A.BODYNO = B.BODYNO)在mssql可以用這樣的方式!!試試看吧!! Pillar Wang
應該這麼說 主檔group一定都是一個 對應的明細檔(同head, body)可能是多筆, 而其中每一筆的group都要update SORRY! 我使用的是FireBird 1.5(支援InterBase 6.5), 並不支援 top 用法! 這樣不知各位明瞭否! 謝謝!
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-04-14 14:03:21 IP:203.95.xxx.xxx 未訂閱
Hi, 若是 interbase 的話, 應該可以使用 ROWS offset TO last 的語法(類似 mssql 的 top)來限制傳回多筆的資料, 請自行試試. ps. 個人覺得比較奇怪的是既然為 Master-Detail 的 detail 更新, 怎麼會有一筆 detail 對應多筆 master 的資料呢?
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-04-14 21:25:16 IP:218.32.xxx.xxx 未訂閱
Firebird 沒用過... 試試看:
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-04-14 22:31:35 IP:61.71.xxx.xxx 未訂閱
引言: Hi, 若是 interbase 的話, 應該可以使用 ROWS offset TO last 的語法(類似 mssql 的 top)來限制傳回多筆的資料, 請自行試試. ps. 個人覺得比較奇怪的是既然為 Master-Detail 的 detail 更新, 怎麼會有一筆 detail 對應多筆 master 的資料呢?
不知道是我表達錯誤, 還是我下的sql語法根本錯誤(我懷疑這個可能性比較大), 因為幾位的回覆似乎都誤解了 D8001 --> Detail 假設有3筆 (headno='210' bodyno='100000', groups=null) D8000 --> master 一定只有一筆(headno='210', body='100000', groups='J1') 我要把 J1 填到 D8001的GROUPS(共3筆) 這樣應該大家都明白了吧, 我目前是寫一支小程式跑do while 去update, 只是蠻好奇, 想了解看看, SQL能不能做的到? 謝謝!
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-04-14 22:47:32 IP:61.71.xxx.xxx 未訂閱
引言: Firebird 沒用過... 試試看: > 一樣的錯誤 或 > 可以通行, 而且檢查結果無誤 或 > 可以通行, 而且檢查與第> < face="Verdana, Arial, Helvetica"> 測試結果, 第2,3種都可以通行, 但我有幾點不明, 1.為何加 max, min可以, 但distinct不行 2.我的 D8000的HEADNO, BODYNO 一定都是只有一筆, 如何會有multiple rows 的狀況, 還是我誤解了update的用法 因為我的"口語化解法"是這麼的 update D8001 B set B.GROUPS = (select A.GROUPS from D8000 A where A.HEADNO = B.HEADNO and A.BODYNO = B.BODYNO) 更新 D8001內的欄位GROUPS = 從 D8000中符合A.HEADNO,A.BODYNO=B.HEADNO, B.BODYNO的條件的A.GROUPS值 謝謝! 發表人 - P.D. 於 2005/04/14 22:57:06
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-04-14 23:14:02 IP:218.32.xxx.xxx 未訂閱
個人覺得, 您的想法並沒有錯, 原來的 Update SQL, 在 Oracle / MSSQL 等資料庫, 應該行得通, 我想只是 DB Server 解析 SQL 的方式不同吧.
系統時間:2024-07-31 3:26:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!