iT邦幫忙

0

SQL Oracle A TABLE合併欄位後,如何在強制寫入到B TABLE的欄位

下面是兩個資料表bmb_file與bmt_file,簡稱bmb和bmt

主要功能是bmt內有BMB01、BMB02、BMB03這三個欄位
當三個欄位相同各自時把BMT06合併,並不顯示重複資料

現在要把合併後的BMT06寫入bmbud01 (不管bmbud01是否有資料)
如下,但出現
錯誤報告 -
ORA-01427: 單列子查詢所傳回的資料列不只一列

UPDATE bmb_file SET (bmbud01)
=(  select bmt.BMT06
    from bmb_file bmb
    join    (   select  bmt.BMT01,bmt.BMT02,bmt.BMT03
                    ,   ( select WMSYS.WM_CONCAT(BMT06) as BMT06
                            from bmt_file
                            where BMT01 = bmt.BMT01 and BMT02 = bmt.BMT02 and BMT03 = bmt.BMT03
                        ) as BMT06
                from    bmt_file bmt
                group by bmt.BMT01,bmt.BMT02,bmt.BMT03
                order by bmt.BMT01,bmt.BMT03
            ) bmt on BMB01 = bmt.bmt01 and BMB02 = bmt.bmt02 and BMB03 = bmt.bmt03
);

http://ithelp.ithome.com.tw/upload/images/20170510/20082456ijsUNcvyrS.jpg

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
做工仔人!
iT邦大師 1 級 ‧ 2017-05-11 17:10:44
update (select bmb.BMBUD01 BMBUD01,bmt.BMT06 BMT06
    from bmb_file bmb
    join    (   select  bmt.BMT01,bmt.BMT02,bmt.BMT03
                    ,   ( select WMSYS.WM_CONCAT(BMT06) as BMT06
                            from bmt_file
                            where BMT01 = bmt.BMT01 and BMT02 = bmt.BMT02 and BMT03 = bmt.BMT03
                        ) as BMT06
                from    bmt_file bmt
                group by bmt.BMT01,bmt.BMT02,bmt.BMT03
                order by bmt.BMT01,bmt.BMT03
            ) bmt on BMB01 = bmt.bmt01 and BMB02 = bmt.bmt02 and BMB03 = bmt.bmt03) set BMBUD01=BMT06
看更多先前的回應...收起先前的回應...
阿偉 iT邦新手 2 級 ‧ 2017-05-11 17:24:08 檢舉

命令行:15, 資料欄:5 發生錯誤
錯誤報告 -
SQL 錯誤: ORA-01779: 無法修改對應非保留索引鍵表格的資料欄
01779. 00000 - "cannot modify a column which maps to a non key-preserved table"
*Cause: An attempt was made to insert or update columns of a join view which
map to a non-key-preserved table.
*Action: Modify the underlying base tables directly.

阿偉 iT邦新手 2 級 ‧ 2017-05-12 11:00:16 檢舉

大大好
我有找到下面資訊,是否還有其他方式來進行回傳,如函數

<回傳資料>
預存程序的基本概念就是執行SQL指令作資料庫的資料處理(甚至是結構變動),並沒有提到回傳值這個地位有點模糊的話題。
這一點在MS-SQL和Oracle資料庫上就有很大的不同,在Oracle資料庫裡,預存程序真的只用於進行資枓處理,而完全沒有回傳資料的功能(事實上它還是可以回傳值給呼叫它的程式,只是無法利用SQL指令取回資料,也無法應用在AW3系統裡);但MS-SQL資料庫中,則是可以在預存程式裡 SELECT 一個表格,它真的會將SELECT指令的執行結果回傳。

要將插件位置回寫到BMB_FILE 的UD欄位的作動是一次性作業,還是經常性作業.
一次性作業:建議先將BMT_FILE 的SELECT 產生一個中間檔. 再用這個中間檔的資料回寫到BMB_FILE .
如果是經常性作業建議將程式放在 abmi601 中.每一顆料維護完成時,即回寫到bmbud01 中.

阿偉 iT邦新手 2 級 ‧ 2017-05-12 14:16:31 檢舉

是一次性的,中間檔有資料可以參考嗎? 或是相關語法

update (select  /*+ BYPASS_UJVC */ bmb.BMBUD01 BMBUD01,bmt.BMT06 BMT06
    from bmb_file bmb
    join    (   select  bmt.BMT01,bmt.BMT02,bmt.BMT03
                    ,   ( select WMSYS.WM_CONCAT(BMT06) as BMT06
                            from bmt_file
                            where BMT01 = bmt.BMT01 and BMT02 = bmt.BMT02 and BMT03 = bmt.BMT03
                        ) as BMT06
                from    bmt_file bmt
                group by bmt.BMT01,bmt.BMT02,bmt.BMT03
                order by bmt.BMT01,bmt.BMT03
            ) bmt on BMB01 = bmt.bmt01 and BMB02 = bmt.bmt02 and BMB03 = bmt.bmt03) set BMBUD01=BMT06
阿偉 iT邦新手 2 級 ‧ 2017-05-15 11:37:18 檢舉

THANKS 我在試試

我要發表回答

立即登入回答