2012-03-22 14 views
0

次の文を使用しています。ORACLEに更新または選択

SELECT RESV_ID, BOOKING_CUS_ID, ACC_ID, 
    (SELECT F.FLI_PRICE FROM FLIGHT F WHERE F.FLI_ID = R.IN_FLIGHT_ID) AS DEPART_FLIGHT_PRICE, 
    (SELECT F1.FLI_PRICE FROM FLIGHT F1 WHERE F1.FLI_ID = R.OUT_FLIGHT_ID) AS RETURN_FLIGHT_PRICE, 
    (SELECT AC.ACC_PRICEPN FROM ACCOMMODATION AC WHERE AC.ACC_ID = R.ACC_ID) AS ACCOMMODATION_PRICE 
    FROM HOLIDAY_RESERVATION R; 

次の結果が得られます。

RESV_ID BOOKING_CUS_ID  ACC_ID DEPART_FLIGHT_PRICE RETURN_FLIGHT_PRICE ACCOMMODATION_PRICE 
---------- -------------- ---------- ------------------- ------------------- ------------------- 
     1    1   2     520     450     350 
     2    3   4     250     150     150 
     3    5   6     290     300     450 
     4    7   7     399     450     650 
     5    9       365     345 
     6    11       558     460 
     7    13       250     250 
     8    15       550     550 
     9    17   25               250 
     10    19   19               450 

10 rows selected. 

質問:予約はどちらかのみ、または飛行宿泊施設だけのために作られたので、私は価格フィールドを合計するにはどうすればよいSOME価格はので、両方の値が常に存在することはないだろう、使用できず、問題はさらに

DEPART_FLIGHT_PRICE RETURN_FLIGHT_PRICE ACCOMMODATION_PRICE 

をどこにあるか、これは次のとおりです。 私はreserに小計に、これらの3つの値のSUMを挿入または更新したいですおそらくselect intoやupdateを使って、私はこれをしようと一日を費やしましたが、私のスキルは限られています。どんな助けでも大歓迎です。

フライトテーブル

FLI_ID FLI_CO FLI_AIRCRA DEPT_AIRPORT ARRV_AIRPORT DEPT_TIME      ARRV_TIME    FLI_PRICE 

    1 BD425 Boeing 707   1   12 18-MAR-12 02.24.00 AM   18-MAR-12 06.24.00 AM   520 
    2 LX345 Beriev 30    6   7 20-MAR-12 03.30.00 PM   20-MAR-12 04.20.00 PM   250 
    3 NZ4445 Boeing 720   9   14 25-MAR-12 09.00.00 AM   25-MAR-12 05.00.00 PM   290 
    4 TP351 Boeing 767   10   15 25-MAR-12 11.25.00 AM   25-MAR-12 03.35.00 PM   399 
    5 BA472 Boeing 720   5   14 26-MAR-12 01.05.00 PM   26-MAR-12 04.15.00 PM   365 

宿泊

ACC_ID ACC_TYPE_CODE ACC_DESC           ACC_PRICEPN ACC_ROOMS RESORT_ID ACC_ADDR       CITY_ID 

    1    1 Three bedroom bungalow near theme park      500   3   1 
    2    1 Two bedroom bungalow next to disney house     350   2   1 
    3    1 One bedroom bungalow with lake view      250   2   2 
    4    2 One bedroom chalet near the lake       150   1   2 
    5    2 Four bedroom chalet near the tree house     600   4   3 

予約

RESV_ID  EMP_ID BOOKING_CUS_ID RESV_DATE HOLIDAY_S HOLIDAY_E IN_FLIGHT_ID OUT_FLIGHT_ID IN_FLIGHT_SEATS_NO OUT_FLIGHT_SEATS_NO  ACC_ID SUBTOTAL 

    1  338    1 16-FEB-12 18-MAR-12 20-APR-12   1   11     2     2   2 
    2  335    3 10-JAN-12 20-MAR-12 22-APR-12   2   12     2     2   4 
    3  338    5 05-MAR-12 25-MAR-12 26-APR-12   3   13     2     2   6 
    4  328    7 02-JAN-12 25-MAR-12 25-APR-12   4   14     2     2   7 
    5  311    9 20-JAN-12 26-MAR-12 21-APR-12   5   15     2     2 
    6  317    11 07-JAN-12 27-MAR-12 22-APR-12   6   16     2     2 
    7  344    13 29-FEB-12 15-MAR-12 12-APR-12   7   17     2     2 
    8  326    15 11-JAN-12 18-MAR-12 12-APR-14   8   18     2     2 
    9  329    17 16-JAN-12 19-MAR-12 17-APR-12                 25 
    10  323    19 18-FEB-12 20-MAR-12 21-APR-12                 19 

がわかりました私は

SELECT HR.RESV_ID, F_IN.FLI_ID, F_IN.FLI_PRICE, F_OUT.FLI_ID, F_OUT.FLI_PRICE, AC.ACC_ID, AC.ACC_PRICEPN, NVL(F_IN.FLI_PRICE,0)+NVL(F_OUT.FLI_PRICE,0)+NVL(AC.ACC_PRICEPN,0) AS TOTAL 
FROM HOLIDAY_RESERVATION HR 
LEFT JOIN FLIGHT F_IN ON HR.IN_FLIGHT_ID = F_IN.FLI_ID 
LEFT JOIN FLIGHT F_OUT ON HR.OUT_FLIGHT_ID = F_OUT.FLI_ID 
LEFT JOIN ACCOMMODATION AC ON HR.ACC_ID = AC.ACC_ID 
ORDER BY HR.RESV_ID; 

を望んでいた結果を得るために管理し

RESV_ID  FLI_ID FLI_PRICE  FLI_ID FLI_PRICE  ACC_ID ACC_PRICEPN  TOTAL 
---------- ---------- ---------- ---------- ---------- ---------- ----------- ---------- 
     1   1  500   11  555   2   350  1405 
     2   2  150   12  253   4   150  553 
     3   3  300   13  345   6   450  1095 
     4   4  450   14  343   7   650  1443 
     5   5  345   15  242        587 
     6   6  460   16  460        920 
     7   7  250   17  250        500 
     8   8  550   18  550        1100 
     9              25   250  250 
     10              19   450  450 

が得られ、次の文は、予約テーブルを更新することです。 今小計を上方行わ和から得られた値が読み込まれ、次のコード

UPDATE HOLIDAY_RESERVATION R SET SUBTOTAL = 
    NVL((SELECT F.FLI_PRICE FROM FLIGHT F WHERE F.FLI_ID = R.IN_FLIGHT_ID), 0) + 
    NVL((SELECT F.FLI_PRICE FROM FLIGHT F WHERE F.FLI_ID = R.OUT_FLIGHT_ID), 0) + 
    NVL((SELECT AC.ACC_PRICEPN FROM ACCOMMODATION AC WHERE AC.ACC_ID = R.ACC_ID), 0); 

のDBA stackxchangeからリーRiffelおかげ>>続い

RESV_ID  EMP_ID BOOKING_CUS_ID RESV_DATE HOLIDAY_S HOLIDAY_E IN_FLIGHT_ID OUT_FLIGHT_ID IN_FLIGHT_SEATS_NO OUT_FLIGHT_SEATS_NO  ACC_ID SUBTOTAL 
---------- ---------- -------------- --------- --------- --------- ------------ ------------- ------------------ ------------------- ---------- ---------- 
     1  338    1 16-FEB-12 18-MAR-12 20-APR-12   1   11     2     2   2  1405 
     2  335    3 10-JAN-12 20-MAR-12 22-APR-12   2   12     2     2   4  553 
     3  338    5 05-MAR-12 25-MAR-12 26-APR-12   3   13     2     2   6  1095 
     4  328    7 02-JAN-12 25-MAR-12 25-APR-12   4   14     2     2   7  1443 
     5  311    9 20-JAN-12 26-MAR-12 21-APR-12   5   15     2     2     587 
     6  317    11 07-JAN-12 27-MAR-12 22-APR-12   6   16     2     2     920 
     7  344    13 29-FEB-12 15-MAR-12 12-APR-12   7   17     2     2     500 
     8  326    15 11-JAN-12 18-MAR-12 12-APR-14   8   18     2     2     1100 
     9  329    17 16-JAN-12 19-MAR-12 17-APR-12                 25  250 
     10  323    19 18-FEB-12 20-MAR-12 21-APR-12                 19  450 

コードがトリガーに追加されました(元の意図)

CREATE OR REPLACE TRIGGER HR_SUBTOTAL 
BEFORE INSERT OR UPDATE ON HOLIDAY_RESERVATION 
FOR EACH ROW 
BEGIN 
    SELECT 
     NVL((SELECT F.Fli_Price FROM Flight F WHERE F.Fli_ID = :new.In_Flight_ID), 0) + 
     NVL((SELECT F.Fli_Price FROM Flight F WHERE F.Fli_ID = :new.Out_Flight_ID), 0) + 
     NVL((SELECT AC.Acc_PricePn FROM Accomodation AC WHERE AC.Acc_ID = :new.Acc_ID), 0) 
     INTO :new.Subtotal 
    FROM dual; 
END; 
/
+0

合計*グループ*は? –

答えて

2

である、あなただけの数字UPDATEについては

NVL(DEPART_FLIGHT_PRICE, 0) + 
NVL(RETURN_FLIGHT_PRICE, 0) + 
NVL(ACCOMMODATION_PRICE, 0) 

NVLを行う必要があるだろう、それが聞こえます相関したUPDATE文が必要なだけです。

UPDATE reservation r 
    SET subtotal = (SELECT (SELECT NVL(DEPART_FLIGHT_PRICE, 0) + 
          NVL(RETURN_FLIGHT_PRICE, 0) + 
          NVL(ACCOMMODATION_PRICE, 0) 
        FROM (SELECT RESV_ID, 
            BOOKING_CUS_ID, 
            ACC_ID, 
            (SELECT F.FLI_PRICE 
            FROM FLIGHT F 
            WHERE F.FLI_ID = R.IN_FLIGHT_ID) AS DEPART_FLIGHT_PRICE, 
            (SELECT F1.FLI_PRICE 
            FROM FLIGHT F1 
            WHERE F1.FLI_ID = R.OUT_FLIGHT_ID) AS RETURN_FLIGHT_PRICE, 
            (SELECT AC.ACC_PRICEPN 
            FROM ACCOMMODATION AC 
            WHERE AC.ACC_ID = R.ACC_ID) AS ACCOMMODATION_PRICE 
          FROM dual)); 
+0

こんにちは、私はNVLの記事を読んでいました。明日は午前4時にそれを試してください:) Thanks Justin –

+0

あまりにも複雑です。このようにすると、オラクルは次のようにします: '... SET小計= NVL(FLIGHT Fサブクエリ)、0)+ NVL(FLIGHT F1サブクエリ)、0)+ NVL((ACACMODATION ACサブクエリ) 0) '? –

+0

私は何時間も働くようにしましたが、まだエラーが発生しました。フライト価格と宿泊費にはNULLは含まれませんが、宿泊施設を予約していない場合は予約で参照できません飛行にも同じ。 acc_idのプライマリキーが予約に存在しない可能性があります。これはヌルです。予約が宿泊施設かフライトか、またはその両方かどうかを確認してから、それらの価格を追加する必要があります。 –

1

あなたが求めている:

をあなたがそれらのいくつかはヌルを持つことができる見ることができるようにどのように私は、価格フィールドを合計します。

DEPART_FLIGHT_PRICE RETURN_FLIGHT_PRICE ACCOMMODATION_PRICE 

ただ、次のようにNVL関数で囲み:

NVL(DEPART_FLIGHT_PRICE, 0) 

をし、それらをまとめます。

第2部では、MERGEステートメントが必要です。良い例は、あなたが0としてNULL値を扱いたいと仮定すると、SUMについてはhttp://www.oracle-developer.net/display.php?id=203

+0

ええ、私はそれを試しましたが、予約テーブルでは、そのタイプの予約で予約が行われなかったため価格は空です。しかし、親テーブルでは、価格は常に価値があり、これは私が抱いている問題です。私が書いている質問は、飛行機と宿泊施設の両方の価値を持つ予約を示しているだけで、宿泊施設のみの予約は表示されていないまたは飛行のみ。 ta –

関連する問題