2017-07-05 9 views
0

を使用して、JOIN、私は以下のようにJSON構造を有する:ネストされた配列は、Oracle 12cとを使用したJSON_TABLE

{ 
    "class": { 
     "students": [{ 
       "name": "Joe", 
       "rollnum": 11, 
       "homephone": 3211113312, 
       "joined_on": "2016-03-01", 
       "subjects": [{ 
        "subject_id": 21, 
        "marks": 53 
       }, { 
        "subject_id": 23, 
        "marks": 43 
       }, { 
        "subject_id": 24, 
        "marks": 35 
       }, { 
        "subject_id": 25, 
        "marks": 90 
       }, { 
        "subject_id": 26, 
        "marks": 87 
       }] 
      }, { 
       "name": "Toe", 
       "rollnum": 12, 
       "homephone": 1231231122, 
       "joined_on": "2016-03-01", 
       "subjects": [{ 
        "subject_id": 21, 
        "marks": 66 
       }, { 
        "subject_id": 23, 
        "marks": 77 
       }, { 
        "subject_id": 24, 
        "marks": 88 
       }, { 
        "subject_id": 25, 
        "marks": 90 
       }, { 
        "subject_id": 26, 
        "marks": 98 
       }] 
      }, 
      { 
       "name": "Roe", 
       "rollnum": 15, 
       "homephone": 3332221111, 
       "joined_on": "2016-03-01", 
       "subjects": [{ 
        "subject_id": 21, 
        "marks": 56 
       }, { 
        "subject_id": 23, 
        "marks": 57 
       }, { 
        "subject_id": 24, 
        "marks": 87 
       }, { 
        "subject_id": 25, 
        "marks": 66 
       }, { 
        "subject_id": 26, 
        "marks": 76 
       }] 
      } 
     ] 
    } 
} 

クラスは複数の生徒を持っており、各学生が複数の被験者に登録されています。このデータは、JSON LOB構造としてテーブルの列に格納されています。今、SubjectIDをネストされた配列からSubjectマスターテーブルに結合しようとすると、それは機能しません。しかし、特定の科目(または他の科目)を照会しようとすると、それは完璧に正常に動作します。

以下は私が使用しているクエリです。助けてください。

SELECT sjson.name,sjson.rollnum,sm.subject_name,sjson.marks 
    FROM 
    students s, 
    JSON_TABLE(ss.student_json,'$.class.students[*]' 
    columns( 
           name varchar2(50) path '$.name', 
     rollnum number path '$.rollnum', 
     homephone number path '$.homephone', 
     joined_on varchar2 path '$.joined_on' , 
       nested path '$.subjects[*]' columns( 
           subject_id number path '$.subject_id', 
           marks number path '$.marks' 
     ) 
     ) 
)sjson, 
    subject_master sm 
    WHERE sjson.name = 'Joe' 
    AND sjson.subject_id = sm.subject_id; 

答えて

0

1)テーブル 'students'は別名 's'ですが、JSON_TABLE入力は 'ss'を参照します。私はこれが単なるタイプであると仮定します。

2)「動作しない」とはどういう意味ですか?返された行やエラーメッセージが表示されていませんか?

3は、i)は、12.1.0.2 RELEASEに軽微な変更でクエリを()しようとすると、動作するように表示されます。

create table subject_master (id number, name varchar2(20)); 

insert into subject_master values(21, 'a'); 
insert into subject_master values(23, 'b'); 
insert into subject_master values(24, 'c'); 
insert into subject_master values(25, 'd'); 
insert into subject_master values(26, 'e'); 

create table students (student_json clob); 
insert into students values ('{ 
"class": { 
    "students": [{ 
      "name": "Joe", 
      "rollnum": 11, 
      "homephone": 3211113312, 
      "joined_on": "2016-03-01", 
      "subjects": [{ 
       "subject_id": 21, 
       "marks": 53 
      }, { 
       "subject_id": 23, 
       "marks": 43 
      }, { 
       "subject_id": 24, 
       "marks": 35 
      }, { 
       "subject_id": 25, 
       "marks": 90 
      }, { 
       "subject_id": 26, 
       "marks": 87 
      }] 
     }, { 
      "name": "Toe", 
      "rollnum": 12, 
      "homephone": 1231231122, 
      "joined_on": "2016-03-01", 
      "subjects": [{ 
       "subject_id": 21, 
       "marks": 66 
      }, { 
       "subject_id": 23, 
       "marks": 77 
      }, { 
       "subject_id": 24, 
       "marks": 88 
      }, { 
       "subject_id": 25, 
       "marks": 90 
      }, { 
       "subject_id": 26, 
       "marks": 98 
      }] 
     }, 
     { 
      "name": "Roe", 
      "rollnum": 15, 
      "homephone": 3332221111, 
      "joined_on": "2016-03-01", 
      "subjects": [{ 
       "subject_id": 21, 
       "marks": 56 
      }, { 
       "subject_id": 23, 
       "marks": 57 
      }, { 
       "subject_id": 24, 
       "marks": 87 
      }, { 
       "subject_id": 25, 
       "marks": 66 
      }, { 
       "subject_id": 26, 
       "marks": 76 
      }] 
     } 
    ] 
} 

を} ');

SELECT sjson.name,sjson.rollnum,sm.name,sjson.marks 
    FROM 
    students s, 
    JSON_TABLE(s.student_json,'$.class.students[*]' 
    columns( 
          name varchar2(50) path '$.name', 
    rollnum number path '$.rollnum', 
    homephone number path '$.homephone', 
    joined_on varchar2 path '$.joined_on' , 
      nested path '$.subjects[*]' columns( 
          subject_id number path '$.subject_id', 
          marks number path '$.marks' 
    ) 
    ) 
)sjson, 
subject_master sm 
WHERE sjson.name = 'Joe' 
AND sjson.subject_id = sm.id; 


NAME        ROLLNUM 
-------------------------------------------------- ---------- 
NAME    MARKS 
-------------------- ---------- 
Joe       11 
a    53 

Joe       11 
b    43 

... 
+0

おかげさまで、これは私が自分のクライアントの別のデータセットで試したことです。明らかに、私の結果は期待通りではありませんでした。私は協力して取り戻そうとします。私が見つけたのは、SQLエンジンがJSONネストされた列とSubject Masterテーブルの間のJOINを正しく認識できなかったことです。 – Kunal

関連する問題