UPDATE 更新兩個資料表 續問 |
缺席
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
請問各位! 延續上一個問題, 詳如下
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 發送簡訊給我 |
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 發送簡訊給我 |
引言: 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 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
引言: 你好 如果確認在明細裡面的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 發送簡訊給我 |
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
引言: 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 發送簡訊給我 |
引言: 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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |