2016-10-24 19 views
0

私は以下のように4つのテーブルを持っています.HL_STUDENT、HL_SEM1_CRSおよびHL_SEM2_CRSテーブルは、STUDENTを主キーとして持ち、HL_TITLEにはSTUDENTフィールドがなく、コース番号(CRS_NBR)をキーとして使用します。テーブルから2つの異なるテーブルから2つの異なる値のフィールドを選択

HL_STUDENT A 
HL_SEM1_CRS B 
HL_SEM2_CRS C 
HL_CRS_TITLE D 

は私がSTUDENTを取得する必要があり、CRS1、CRS1-TITLE-DESC、CRS2、CRS2-TITLE-DESC示すようbelow.Iは、両方のコース1とコース2

のためのコースdescripionを必要とします
STUDENT CRS-1 CRS1-TITLE-DESC CRS-2 CRS2-TITLE-DESC 
1  25 MATH    35  HISTORY 
2  35 HISTORY   25  MATH 

次のように、HL_CRS_TITLEテーブルを2回、異なるALIASに参加させて解決策を検討していました。

SELECT DISTINCT A.STUDENT 
       ,B.CRS_1 
       ,D.CRS_TITLE_DESC 
       ,C.CRS_2 
       ,E.CRS_TITLE_DESC 
FROM HL_STUDENT A 
LEFT JOIN HL_SEM1_CRS B ON A.STUDENT = B.STUDENT 
LEFT JOIN HL_CRS_TITLE D ON D.CRS_NBR = B.CRS_1 
LEFT JOIN HL_SEM2_CRS B ON A.STUDENT = B.STUDENT 
LEFT JOIN HL_CRS_TITLE E ON E.CRS_NBR = B.CRS_2 

ソリューションを入手するより良い方法をお勧めしますか?

私はORACLE DBに対してクエリを実行しています。

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

答えて

0

最初の学期に学生とコースに参加して2学期に入学すると、問題は重複していると理解しています。

その本当のあなたは、コースの間FULL JOINを使用し、ダブルHL_CRS_TITLEに参加せず、学生やタイトル

SELECT DISTINCT A.STUDENT 
      ,B.CRS_1 
      ,D.CRS_TITLE_DESC 
      ,B.CRS_2 
      ,E.CRS_TITLE_DESC 
FROM HL_STUDENT A 
JOIN (SELECT NVL(B1.STUDENT, B2.STUDENT) as STUDENT, B1.CRS_1, B2.CRS_2 
     FROM HL_SEM1_CRS B1 
     FULL JOIN HL_SEM2_CRS B2 ON B1.STUDENT = B2.STUDENT AND B1.CRS_1 = B2.CRS_2) B ON A.STUDENT = B.STUDENT 
LEFT JOIN HL_CRS_TITLE D ON D.CRS_NBR = B.CRS_1 
LEFT JOIN HL_CRS_TITLE E ON E.CRS_NBR = B.CRS_2 

例でそれに参加することができます。

SELECT DISTINCT A.STUDENT 
      ,B.CRS_1 
      ,nvl2(B.CRS_1, D.CRS_TITLE_DESC, null) as CRS_TITLE_DESC_1 
      ,B.CRS_2 
      ,nvl2(B.CRS_2, D.CRS_TITLE_DESC, null) as CRS_TITLE_DESC_2 
FROM HL_STUDENT A 
JOIN (SELECT NVL(B1.STUDENT, B2.STUDENT) as STUDENT,nvl(B1.CRS_1, B2.CRS_2) as CRS,B1.CRS_1, B2.CRS_2 
     FROM HL_SEM1_CRS B1 
     FULL JOIN HL_SEM2_CRS B2 ON B1.STUDENT = B2.STUDENT AND B1.CRS_1 = B2.CRS_2) B ON A.STUDENT = B.STUDENT 
LEFT JOIN HL_CRS_TITLE D ON D.CRS_NBR = B.CRS 
+0

こんにちは、問題はduplicates.Iではなく、必要とすることなく、学期の両方の記録のためのコースのタイトルを取得する必要がありますHL_CRS_TITLEを2回参加させる –

+0

HL_CRS_TITLEに2回参加することなく、例を追加します。しかし、私はその解決策の利点を見ていません –

+0

あなたの時間のためのマイケルありがとうございました。当分、私はHL_CRS_TITLEテーブルに2回参加する私の元のアプローチに行くと思います。 –

0

私は、HL_CRS_TITLEに2回参加することなく、両方の学期の記録のコースタイトルを取得する方法を探していると思います。
私は一度同様の状況に遭遇し、その目的に役立つ機能を作成しました。

--Function DDL 
CREATE OR REPLACE FUNCTION F_GET_CRS_TITLE (IN_CRS_NBR IN NUMBER) 
RETURN VARCHAR2 
RESULT_CACHE 
AS 
LV_CRS_TITLE_DESC VARCHAR2(100); 
BEGIN 
SELECT CRS_TITLE_DESC 
INTO LV_CRS_TITLE_DESC 
FROM HL_CRS_TITLE 
WHERE CRS_NBR = IN_CRS_NBR; 
RETURN LV_CRS_TITLE_DESC; 
EXCEPTION 
WHEN NO_DATA_FOUND THEN 
    RETURN 'NO_COURSE_EXISTS'; 
END; 
/

あなたは以下のようなクエリを再作成することができます:

SELECT DISTINCT A.STUDENT 
       ,B.CRS_1 
       ,F_GET_CRS_TITLE(B.CRS_1) 
       ,C.CRS_2 
       ,F_GET_CRS_TITLE(C.CRS_2) 
FROM HL_STUDENT A 
LEFT JOIN HL_SEM1_CRS B ON A.STUDENT = B.STUDENT 
LEFT JOIN HL_SEM2_CRS C ON A.STUDENT = C.STUDENT; 
+0

、はい、私はHL_CRS_TITLEに2回参加することなく、両方の学期の記録のコースタイトルを取得しようとしています。 –

+0

、はい - 私はHL_CRS_TITLEに2回参加する必要なく、両方の学期の記録のコースタイトルを取得しようとしています。しかし、私は関数を使用せずにこれを行うことができる方法があります。私はあなたがPL/SQL用ですが、私はPRO * COBOLを使用しています。 –

関連する問題