2017-07-05 59 views
0

使用Oracle 12c中,我有如下一個JSON結構:嵌套數組 - JOIN使用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)table'students'別名爲's',但JSON_TABLE輸入引用'ss'。我認爲這只是一種類型。

2)你不解釋什麼「不工作」是什麼意思?你看到沒有行返回或錯誤消息?

3)我試圖在12.1.0.2釋放你的查詢(輕微改變),它似乎工作:

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