iT邦幫忙

0

Oracle PLSQL 問題

  • 分享至 

  • xImage

有一個PLSQL問題想請教各位,請指教哪裡有問題。
我 Cursor c2 中的select distinct 就是想移除重複part,
資料更新的結果如下,為何Part 的 AAA price 會更新三筆為 5,我預期Cursor c2 只要重複part 只要更新一筆price 5 即可。
請各位高手指引方向或是觀念錯誤地方:

Part    price    custome     wip
AAA     5        Nick        1 
AAA     5        Eric        10
AAA     5        Jack        20
BBB     7        Edison      30
CCC     5        Candy       100
DDD     4        Connie      1
DDD     4        Lucy        22

程式範例:

CURSOR c1
IS
   SELECT part FROM bom_part;

CURSOR c2
IS
   SELECT DISTINCT part FROM my_table;

BEGIN
   FOR i IN c1
   LOOP
      SELECT part, pricr, custome, wip FROM bom_part
	  WHERE i.part = part;     
      INSERT INTO my_table (part, price, custome, wip) VALUE (i.part, 0, custome, wip);
   END LOOP;

   FOR i IN c2
   LOOP
      SELECT price INTO v_price FROM pj_project
      WHERE part = i.part
      UPDATE my_table
        SET price = v_price
      WHERE  part = i.part  
   END LOOP;
END;
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
shengfu
iT邦新手 2 級 ‧ 2015-01-21 08:40:40
最佳解答

只要重複part 只要更新一筆price 5 即可。

如果只要更新一筆重覆資料

可以下這樣

--借用antijava 大大的Sql改寫
UPDATE my_table
SET price = 5
WHERE part = "AAA"
and rownum=1 --限定筆數

0
海綿寶寶
iT邦大神 1 級 ‧ 2015-01-21 00:04:51

你所謂的 distinct
是在原來的七筆(AAA(3),BBB,CCC,DDD(2))中
挑出 AAA,BBB,CCC,DDD

而這三列 SQL 指令

<pre class="c" name="code">UPDATE my_table  
        SET price = v_price  
      WHERE  part = i.part 

執行時會將 AAA,BBB,CCC,DDD 分別帶入
執行 AAA 時大概像這樣

<pre class="c" name="code">UPDATE my_table  
        SET price = 5
      WHERE  part = "AAA" 

那麼
會更新三筆 AAA
是沒錯的

其實你該自己想一下
如果真的只更新一筆的話
以 part="AAA" 這個條件
資料庫他應該替你更新 02,03,04 那一筆呢?
(三筆都符合你的條件)

看更多先前的回應...收起先前的回應...
尼克 iT邦大師 1 級 ‧ 2015-01-21 10:32:34 檢舉

感謝你的回覆,因為我WHERE 條件沒辦法在下,所以使用shengfu 建議的ROWNM = 1 隨機一筆即可。
感恩!

nickliao1提到:
隨機一筆即可。

這個邏輯, 我真的無言以對了
落寞

外獅佬 iT邦大師 1 級 ‧ 2015-01-21 11:16:25 檢舉

強烈懷疑...
其實應該是DISTINCT part,price才對

尼克 iT邦大師 1 級 ‧ 2015-01-21 11:53:39 檢舉

感謝大家回覆,以上只是範例,原始程式考慮點不只如此。你們的建議我也會好好想想,目前先解決問題為先。
感恩!謝謝

我要發表回答

立即登入回答