2016-07-22 5 views
0

ありがとう、私はこのフォーラムの寛大な人々から大きな助けを得ています。私はOracle SQLの初心者です。Oracle Select Query to on many、Inner Query、Not Group expressionを選択します。 JOINからの重複

PERSON_VIEWとPHONE_VIEWの2つのVIEWの間に1対多の関係があります。助けを借りて、私は電話のためのケース/時には、私はメインのクエリに戻ってそれを追加したときにクエリを持って、それはTASK_VIEWと私の他の参加に影響を与えた。

私はそれを内部クエリとして追加する必要があると考えて、結果を1つ戻しました。私は私の質問に以下を追加しました。 TOADで問合せを実行したところ、「ORA-00979:GROUP BY式ではありません」というエラーが表示され、問合せのすべてのPERSON_IDが強調表示されました。次の左結合を取ると、正常に実行され、電話番号が出力されません。どんな助けもありがとうございます。

私は3つの電話番号(セル、家庭、ビジネス)を回収しているので、TASKから帰ってきてもダブが発生することに気付きました。タスク内部結合では、 私は前に

のような結果を得る:後ToDo2

: 1ジョン・M. DoeのToDo1:ToDO1、ToDo1:ToDO1、 1ジョン・M. DoeのToDo1:ToDO1、ToDo2 ToDo1:ToDo1、ToDo2:ToDo2、ToDo2:ToDo2、ToDo2:ToDo2

私は3つのケースステートメントのうち最大値をとり、クエリを実行しました。しかし、それは私が修正することができますどのように

1ジョン・ドウ999-999-9999 1ジョン・ドウ888-888-8888 1ジョン・ドウ222-222-2222

のように各電話番号に対して個別の行を返しますこの?

LEFT JOIN (SELECT PERSON_ID, PHONE_TP_SHORT_DESC, 
        max(case when PHONE_TYPE = 'HOME' then PHONE_NUMBER end) as HOME_PHONE, 
        max(case when PHONE_TYPE = 'BUSINESS' then PHONE_NUMBER end) as BUSINESS_PHONE,  
        max(case when PHONE_TYPE = 'CELL' then PHONE_NUMBER end) as CELL_PHONE 
      FROM PHONE_VIEW) PHONE 
ON PERSON.PERSON_ID = PHONE.PERSON_ID AND PHONE.PHONE_TYPE IN ('HOME','BUSINESS','CELL') 

は、ここで私は、私はあなたのクエリの一つの問題を見ています

SELECT PERSON.PERSON_ID, 
     PERSON.FIRST_NAME, 
     PERSON.MIDDLE_NAME, 
     PERSON.LAST_NAME, 
     PERSON.USER_NAME, 
     PHONE.HOME_PHONE, 
     PHONE.BUSINESS_PHONE, 
     PHONE.CELL_PHONE, 

LISTAGG(case 
     when SKILLS.SKILL_SHORT_DESC = 'ToDo1' then 'ToDo1:ToDo1' 
     when SKILLS.SKILL_SHORT_DESC = 'ToDo2' then 'ToDo2:ToDo2' 
     when SKILLS.SKILL_SHORT_DESC = 'ToDo3' then 'ToDo3:ToDo3' 
     when SKILLS.SKILL_SHORT_DESC = 'ToDo4' then 'ToDo4:ToDo4' 
     when SKILLS.SKILL_SHORT_DESC = 'ToDo5' then 'ToDo5:ToDo5' 
     when SKILLS.SKILL_SHORT_DESC = 'ToDo6' then 'ToDo6:ToDo6' 
     else '' 

end, ',') 
WITHIN GROUP (ORDER BY TASK.TASK_DESC) AS TASK 

FROM PERSON_VIEW PERSON 

LEFT JOIN (SELECT PERSON_ID, PHONE_TP_SHORT_DESC, 
        max(case when PHONE_TYPE = 'HOME' then PHONE_NUMBER end) as HOME_PHONE, 
        max(case when PHONE_TYPE = 'BUSINESS' then PHONE_NUMBER end) as BUSINESS_PHONE,  
        max(case when PHONE_TYPE = 'CELL' then PHONE_NUMBER end) as CELL_PHONE 
      FROM PHONE_VIEW) PHONE 
ON PERSON.PERSON_ID = PHONE.PERSON_ID AND PHONE.PHONE_TYPE IN ('HOME','BUSINESS','CELL')     


LEFT JOIN (SELECT DISTINCT PERSON_ID, TASK_DESC FROM TASK_VIEW) SKILLS 
ON SKILLS.PERSON_ID = PERSON.PERSON_ID 


GROUP BY 
PERSON.PERSON_ID, 
PERSON.FIRST_NAME, 
PERSON.MIDDLE_NAME, 
PERSON.LAST_NAME, 
PERSON.USER_NAME, 
PHONE.HOME_PHONE, 
PHONE.BUSINESS_PHONE, 
PHONE.CELL_PHONE 

答えて

0

をデバッグしようとしています私の全体のクエリです。

ON PERSON.PERSON_ID = PHONE.PERSON_ID AND 
    PHONE.PHONE_TYPE IN ('HOME','BUSINESS','CELL') 

そこには列がPHONE_TYPEが利用可能と呼ばないで、と私は期待:ON状態であなたはPHONE_TYPEと呼ばれる列を参照してください、

(SELECT PERSON_ID, 
     PHONE_TP_SHORT_DESC, 
     max(case when PHONE_TYPE = 'HOME' then PHONE_NUMBER end) as HOME_PHONE, 
     max(case when PHONE_TYPE = 'BUSINESS' then PHONE_NUMBER end) as BUSINESS_PHONE,  
     max(case when PHONE_TYPE = 'CELL' then PHONE_NUMBER end) as CELL_PHONE 
FROM PHONE_VIEW) PHONE 

しかし:あなたは、次のサブクエリにLEFT JOINを持っていますこれからのエラー場合によっては、データベース(またはコンパイラ)から取得するエラーメッセージが、問題の根本的な原因を常に明らかにするとは限らないという点で誤解を招くことがあります。

エラーの原因としては、ビューを使用していて、テーブルとは異なる動作をする可能性があります。

+0

PHONE_TYPEがテーブルPHONE_VIEWで使用できない、またはあなたの推測だけで利用できない、または選択リストにないwhere節のカラムを使用できないと考えている合理的な背景があります。 – XING

+0

エイリアス 'PHONE'はサブクエリAFAIKを参照します。そのサブクエリで選択された列のみが、サブクエリの外部で使用可能になります。 –

+0

Ohhh ..私は彼がPHONE.PHONE_TYPEを使用したのを見ました....私は彼がPHONE_VIEW.PHONE_TYPEを使用したと思ったcozに尋ねました...私の間違い – XING