2014-09-13 78 views
0

我在查詢Oracle數據庫,使用XMLELEMENT和XMLFOREST在每行中創建XML。 對於單表它工作正常。但我的要求是現在從3個不同的表中獲取數據。XML直接通過查詢ORACLE db

描述:

表主要,SecondTable,ThirdTable。其中Main和SecondTable具有唯一的TxnID,而在ThirdTable中它重複。

例子:

Main Table      SecondTable      ThirdTable 

TxnId A B C    D TxnId E F     G H I TxnId 

1001 3 4 6    5 1001 6 2     2 5 5 1001 
1002 5 6 2    4 1002 5 6     6 8 9 1001 
1003 5 4 2    6 1003 5 6     8 9 8 1001 

我想reperesent在XML這些數據,到目前爲止,我能夠用得到的XML的形式第一行,

Select XMLELELEMENT(("Event", XMLFOREST(m.A as 'A', 
             m.B as 'B', 
             m.C as 'C') || 
           XMLELEMENT("SecondTable", 
             XMLFOREST(s.E as 'E', 
                s.F as 'F')) || 
           XMLELEMENT("ThirdTable", 
             XMLFOREST(t.G as 'G', 
                t.H as 'H', 
                t.I as 'I'))) 
    from Main m 
    JOIN SecondTable s 
    ON m.TxnId=s.TxnId 
    JOIN ThirdTable t 
    ON s.TxnId=t.TxnId 

該查詢會給我輸出like--

<Event> 
    <Main> 
     <A>3</A> 
     <B>4</B> 
     <C>6</C> 
    </Main> 
    <SecondTable> 
     <E>6</E> 
     <F>2</F> 
    </SecondTable> 
     <ThirdTable> 
      <G>2</G> 
      <H>5</H> 
      <I>5</I> 
     </ThirdTable> 
</Event> 

問題:ThirdTable的我想重複TxnIds形成3阻止在一個單一的XML。我希望我很清楚。 請幫幫我。 在此先感謝。

+0

可以通過PL SQL完成嗎? 請指導我somebdy。 – Braine 2014-09-13 20:20:29

+0

請編輯你的問題,並提供你想要的輸出和你得到的輸出的例子。 – 2014-09-14 20:16:15

+0

此外,您發佈的查詢不會執行 - [請參閱此SQLFiddle](http://sqlfiddle.com/#!4/93201/3)。它會產生一個「缺少右括號」的錯誤(顯然是在第一次調用XMLELEMENT後有兩個左側的parens導致的),但是如果糾正了這個錯誤,就會出現「missing identifier」錯誤。這裏的人願意嘗試和幫助,但你必須儘自己的一份力量。請編輯你的問題,幷包含一個查詢,它會產生你顯示的輸出。謝謝。 – 2014-09-14 20:27:46

回答

0

您可以使用xmlagg函數以及group by子句來實現此目的。我還包括一個outter加入到ThirdTable。請在下面看到我的解決方案,希望這有助於:

情況下設置:

  create table main 
      (txnid number(4),a VARCHAR2(1), b VARCHAR2(1), c VARCHAR2(1)); 

      insert into main values (1001, 3 ,4 ,6); 
      insert into main values (1002, 5 ,6 ,2); 
      insert into main values (1003, 5 ,4 ,2); 

      create table secondtable 
      (d VARCHAR2(1),txnid number(4), e VARCHAR2(1), f VARCHAR2(1)); 

      insert into secondtable values (5, 1001 ,6 ,2); 
      insert into secondtable values (4, 1002 ,5 ,6); 
      insert into secondtable values (6, 1003 ,5 ,6); 

      create table thirdtable 
      (g VARCHAR2(1), h VARCHAR2(1), i VARCHAR2(1), txnid number(4)); 


      insert into thirdtable values (2, 5 ,5 ,1001); 
      insert into thirdtable values (6, 8 ,9 ,1001); 
      insert into thirdtable values (8, 9 ,8 ,1001); 

      commit; 

查詢:

  select XMLELEMENT("Event", xmlelement("Main", 
              XMLFOREST(m.A as "A", 
                m.B as "B", 
                m.C as "C")), 
              XMLELEMENT("SecondTable", 
                 XMLFOREST(s.E as "E", 
                   s.F as "F")) , 
              xmlagg(XMLELEMENT("ThirdTable", 
                 XMLFOREST(t.G as "G", 
                   t.H as "H", 
                   t.I as "I")))) xml_payload 
      from main m, secondtable s, thirdtable t 
      where m.TxnId=s.TxnId 
      and s.TxnId=t.TxnId(+) 
      group by m.txnid, s.txnid, m.a, m.b, m.c, s.e, s.f; 

替代,使用子選擇,並通過與outter刪除組加入:

  select XMLELEMENT("Event", xmlelement("Main", 
               XMLFOREST(m.A as "A", 
                  m.B as "B", 
                  m.C as "C")), 
                XMLELEMENT("SecondTable", 
                  XMLFOREST(s.E as "E", 
                     s.F as "F")),               
                (select xmlagg(XMLELEMENT("ThirdTable", 
                  XMLFOREST(t.G as "G", 
                     t.H as "H", 
                     t.I as "I"))) 
                from thirdtable t 
                where s.TxnId=t.TxnId 
                )) xml_payload 
        from main m, secondtable s 
        where m.TxnId=s.TxnId; 

將第三張表格中的所有元素都重複一次只是將xmlagg向下移動一級:

  select XMLELEMENT("Event", xmlelement("Main", 
               XMLFOREST(m.A as "A", 
                  m.B as "B", 
                  m.C as "C")), 
                XMLELEMENT("SecondTable", 
                  XMLFOREST(s.E as "E", 
                     s.F as "F")),               
                (select XMLELEMENT("ThirdTable",xmlagg(
                  XMLFOREST(t.G as "G", 
                     t.H as "H", 
                     t.I as "I"))) 
                from thirdtable t 
                where s.TxnId=t.TxnId 
                )) xml_payload 
        from main m, secondtable s 
        where m.TxnId=s.TxnId; 
+0

感謝您的回覆,這個查詢是否會重複第三張表的TxnIds,以在單個XML中形成三個塊? – Braine 2014-09-16 17:37:51

+0

因爲在我們的要求中,我們不知道txnId會重複多少次。如果重複,則查詢應通過形成所需數量的塊來處理。對於上面的例子 Braine 2014-09-16 17:51:17

+0

我以前的例子將重複節點下在第三表中的每一行(但許多存在用於txnid)。通過這種方式,您可以看到哪些G/H/I歸在一起 - 即XML格式良好。但是,如果您確實需要在相同的節點下重複的G/H/I節點,請參閱我的修改答案。希望這可以幫助。 J – 2014-09-17 09:53:46

相關問題