2016-11-11 13 views
1

私はoracle 10gデザイナとsqlplusを使用してデータベースシステムで作業しています 作成しなければならない複数のクエリがありますが、ほとんどは簡単ですが、sqlplusの複数の重複行

実行時に、実際には17行のデータを返す必要がある場合、204行のデータが返されるというクエリがあります。行は12x回繰り返しているようです。私はこの周りに私の頭を包むことはできません。それは数時間です。私は自分のコード、クエリの外観(scs形式)、ERD、結果のスクリーンショット、およびEXPLAIN PLAY TABLEの出力のスクリーンショットを提出しています。繰り返し行は、最後の10列の結果です。

誰でも手助けできますか?

COLUMN C_FNAME FORMAT A10 
COLUMN C_LNAME FORMAT A10 
COLUMN C_ORG FORMAT A35 
COLUMN C_ADR FORMAT A35 
COLUMN C_CNUM FORMAT 9999999 
COLUMN E_ID FORMAT A7 
COLUMN E_NAME FORMAT A35 
COLUMN E_FTIME FORMAT A21 
COLUMN E_STIME FORMAT A21 
COLUMN ET_DESC FORMAT 10 
COLUMN V_NAME FORMAT A30 
COLUMN V_ADDRESS FORMAT A35 
COLUMN V_CNUM FORMAT 9999999 
COLUMN D_DESC FORMAT A30 
COLUMN D_AMT FORMAT A3 
COLUMN ST_DESC FORMAT A15 
COLUMN S_FNAME FORMAT A15 
COLUMN S_LNAME FORMAT A15 
COLUMN EQ_TYPE FORMAT A15 
COLUMN EQ_DESC FORMAT A15 
COLUMN EQ_AMT FORMAT A3 
COLUMN SU_NAME FORMAT A40 
BREAK ON C_FNAME ON C_LNAME ON C_ORG ON C_ADR ON C_CNUM ON E_ID ON E_NAME ON E_STIME ON E_FTIME ON ET_DESC ON V_NAME ON V_ADDRESS ON V_CNUM ON D_DESC ON D_AMT ON EQ_TYPE ON EQ_DESC ON EQ_AMT ON SU_NAME 
SELECT C_FNAME, C_LNAME, C_ORG, C_ADR, C_CNUM, E_ID, E_NAME, E_FTIME, E_STIME, ET_DESC, V_NAME, V_ADDRESS, V_CNUM, D_DESC, D_AMT, ST_DESC, S_FNAME, S_LNAME, EQ_TYPE, EQ_DESC, EQ_AMT, SU_NAME 
FROM CUSTOMER, EVENTTYPE, STAFFTYPE, VENUE, EVENT, STAFF, EVENT_DISHES, EVENT_EQUIPMENT, EVENT_STAFF, DISHES, EQUIPMENT, SUPPLIER 
WHERE E_ID ='E000001' 
AND CUSTOMER.C_ID = EVENT.C_C_ID 
AND EVENTTYPE.ET_ID = EVENT.ET_ET_ID 
AND VENUE.V_ID = EVENT.V_V_ID 
AND EVENT_DISHES.E_E_ID = EVENT.E_ID 
AND EVENT_DISHES.D_D_ID = DISHES.D_ID 
AND EVENT_EQUIPMENT.E_E_ID = EVENT.E_ID 
AND EVENT_EQUIPMENT.EQ_EQ_ID = EQUIPMENT.EQ_ID 
AND EQUIPMENT.SU_SU_ID = SUPPLIER.SU_ID 
AND EVENT_STAFF.E_E_ID = EVENT.E_ID 
AND EVENT_STAFF.S_S_ID = STAFF.S_ID 
AND STAFF.ST_ST_ID = STAFFTYPE.ST_ID; 

enter image description here

enter image description here

enter image description here

enter image description here

+0

私はsqlplusをかなり使い慣れています。私は一緒に勉強しています –

+0

実行計画を提供できますか? 'explain plan for 'を実行してください。完了すると、 'select * from table(dbms_xplan.display);'を実行してください。あなたの質問に出力を追加してください。 –

+0

おやすみなさい。あなたの応答に感謝します。私は要求された情報を追加しました –

答えて

0

それはあなたがANSI互換性のある結合構文を使用するようにクエリを再構築場合やすくなり、代わりにWHEREで=かもしれません句。

SELECT C_FNAME, C_LNAME, C_ORG, C_ADR, C_CNUM, E_ID, E_NAME, E_FTIME, E_STIME, ET_DESC, V_NAME, V_ADDRESS, V_CNUM, D_DESC, D_AMT, ST_DESC, S_FNAME, S_LNAME, EQ_TYPE, EQ_DESC, EQ_AMT, SU_NAME 
FROM customer 
INNER JOIN event ON CUSTOMER.C_ID = EVENT.C_C_ID 
INNER JOIN eventtype ON EVENT.ET_ET_ID = EVENTTYPE.ET_ID 
INNER JOIN venue ON EVENT.V_V_ID = VENUE.V_ID 
INNER JOIN EVENT_DISHES ON EVENT.E_ID = EVENT_DISHES.E_E_ID 
INNER JOIN DISHES ON DISHES.D_ID = EVENT_DISHES.D_D_ID 
INNER JOIN EVENT_EQUIPMENT ON EVENT.E_ID = EVENT_EQUIPMENT.E_E_ID 
INNER JOIN EQUIPMENT ON EVENT_EQUIPMENT.EQ_EQ_ID = EQUIPMENT.EQ_ID 
INNER JOIN SUPPLIER ON SUPPLIER.SU_ID = EQUIPMENT.SU_SU_ID 
INNER JOIN EVENT_STAFF ON EVENT.E_ID = EVENT_STAFF.E_E_ID 
INNER JOIN STAFF ON STAFF.S_ID = EVENT_STAFF.S_S_ID 
INNER JOIN STAFFTYPE ON STAFFTYPE.ST_ID = STAFF.ST_ST_ID 
WHERE E_ID ='E000001'; 

私はあなたのデータは今間違っているが、これは開始する場所である理由の中に探しています。

event_equipmentテーブルとサプライヤテーブルの結合に問題があると思います。そのテーブル内のデータは一意ですか?

+0

おはようございます。私はあなたのソリューションを試して、結果は同じ204行が返されます。ユニーク? event_equipmentテーブルは、各イベントのID、各機器のID、およびイベントごとに使用される機器のAMTを保持します。 –

2

返される204行は、クエリの結果として正しい量です。 あなたは17人の職員がいます(タイプは唯一の派生元です)。これらの17行に2つの皿が掛けられ、2人の雇用者と4人の必要な(2 + 4 = 6)雇用者が乗算されます。 17 * 2 * 6は204行になります。

EVENT_DISHESに問い合わせて、これまでの17個の行を指定されたE_IDと一致する結果で埋めるようにし、そのたびに2つのd_d_idを返します。

あなたの目標は、プログラムで提供したフォームを作成することだと思います。これを達成するには、データベースを4回照会する必要があります。一度イベントのために、一度は料理のために、一度は設備のために、そして一度はイベントに関係するスタッフのために。

SELECT C_FNAME, C_LNAME, C_ORG, C_ADR, C_CNUM, E_ID, E_NAME, E_FTIME, E_STIME, ET_DESC, V_NAME, V_ADDRESS, V_CNUM 
FROM event 
INNER JOIN customer ON EVENT.C_C_ID = CUSTOMER.C_ID 
INNER JOIN eventtype ON EVENT.ET_ET_ID = EVENTTYPE.ET_ID 
INNER JOIN venue ON EVENT.V_V_ID = VENUE.V_ID 
WHERE E_ID ='E000001'; 

SELECT D_DESC, D_AMT 
FROM EVENT_DISHES 
INNER JOIN DISHES ON DISHES.D_ID = EVENT_DISHES.D_D_ID 
WHERE E_E_ID ='E000001'; 

SELECT EQ_TYPE, EQ_DESC, EQ_AMT, SU_NAME 
FROM EVENT_EQUIPMENT 
INNER JOIN EQUIPMENT ON EVENT_EQUIPMENT.EQ_EQ_ID = EQUIPMENT.EQ_ID 
INNER JOIN SUPPLIER ON SUPPLIER.SU_ID = EQUIPMENT.SU_SU_ID 
WHERE E_E_ID ='E000001'; 

SELECT ST_DESC, S_FNAME, S_LNAME 
FROM EVENT_STAFF 
INNER JOIN STAFF ON STAFF.S_ID = EVENT_STAFF.S_S_ID 
INNER JOIN STAFFTYPE ON STAFFTYPE.ST_ID = STAFF.ST_ST_ID 
WHERE E_E_ID ='E000001'; 

私はすべてのフィールドを対応するクエリに正しく一致させたいと思います。必要に応じて修正します。

+0

このアプローチでは、(暗黙の)INNER JOINSによってイベントが表示される前にすべての**コンポーネントが存在する必要があるということも回避されます。 – RicmanX

+0

ありがとうございました –

関連する問題