Oracle - Сравнение столбцов XMLType в Select Query - PullRequest
0 голосов
/ 14 февраля 2019

Моя схема базы данных выглядит следующим образом:

ID  IDLANE  COMPONENT (XMLType COlumn)                  IDDATE  
--- ------  ---------                                   ------
111 111R1   <?xml version="1.0" encoding="utf-8"?>      2019-02-10T10:00:00
            <Rowsets>
            <Rowset Name="Item">
            <Row>
                <IDLANE>111R1</IDLANE>
                <ID>111</ID>
                <ORDER>0111000</ORDER>
                <ITEM>000010</ITEM>
                <MATERIAL>000000000257</MATERIAL>
            </Row>
            <Row>
                <IDLANE>111R1</IDLANE>
                <ID>111</ID>
                <ORDER>0111000</ORDER>
                <ITEM>000020</ITEM>
                <MATERIAL>000000000258</MATERIAL>
            </Row>
            </Rowset>
            </Rowsets>



111 111R2   <?xml version="1.0" encoding="utf-8"?>      2019-02-10T11:00:00
            <Rowsets>
            <Rowset Name="Item">
            <Row>
                <IDLANE>111R2</IDLANE>
                <ID>111</ID>
                <ORDER>0111000</VBELN>
                <ITEM>000010</ORDER>
                <MATERIAL>000000000257</MATERIAL>
            </Row>
            <Row>
                <IDLANE>111R2</IDLANE>
                <ID>111</ID>
                <ORDER>0111000</ORDER>
                <ITEM>000020</ITEM>
                <MATERIAL>000000000258</MATERIAL>
            </Row>
            </Rowset>
            </Rowsets>


222 222R1   <?xml version="1.0" encoding="utf-8"?>      2019-02-10T13:00:00
            <Rowsets>
            <Rowset Name="Item">
            <Row>
                <IDLANE>222R1</IDLANE>
                <ID>222</ID>
                <ORDER>0222000</ORDER>
                <ITEM>000010</ITEM>
                <MATERIAL>000000000257</MATERIAL>
            </Row>
            <Row>
                <IDLANE>222R1</IDLANE>
                <ID>111</ID>
                <ORDER>0222000</ORDER>
                <ITEM>000020</ITEM>
                <MATERIAL>000000000258</MATERIAL>
            </Row>
            </Rowset>
            </Rowsets>  

222 222R2   <?xml version="1.0" encoding="utf-8"?>      2019-02-10T14:00:00
            <Rowsets>
            <Rowset Name="Item">
            <Row>
                <IDLANE>222R2</IDLANE>
                <ID>222</ID
                <ORDER>0222000</ORDER>
                <ITEM>000010</ITEM>
                <MATERIAL>000000000259</MATERIAL
            </Row>

            </Rowset>
            </Rowsets>  


333 333R1   <?xml version="1.0" encoding="utf-8"?>      2019-02-10T18:00:00
            <Rowsets>
            <Rowset Name="Item">
            <Row>
                <IDLANE>333R1</IDLANE>
                <ID>333</ID
                <ORDER>0333000</ORDER>
                <ITEM>000010</ITEM>
                <MATERIAL>000000000259</MATERIAL
            </Row>

            </Rowset>
            </Rowsets>  

Мое требование - получить все идентификаторы, которые:

exists more than one AND 
<ORDER> is same for all of them AND 
<ITEM> is same for all of them AND  
<MATERIAL> is same for all of them

Для данных, которые я предоставил, вывод запроса долженбыть:

ID    IDLANE    IDDATE
111   111R1     2019-02-10T10:00:00
111   111R2     2019-02-10T11:00:00

It wont include 222 because both 222 IDs have different Material.

Я написал запрос для идентификации более одного идентификатора, как показано ниже:

SELECT ID FROM IDTABLE 
GROUP BY ID
HAVING COUNT(*) > 1

Выше запрос дает мне 111 & 222 в качестве ответов, потому что оба идентификатора существуют более чемодин.Но мне нужно сравнить XMLTyple COlumn's, а также с каждым идентичным идентификатором, появляющимся дважды.Но я не знаю, как сравнивать столбцы типа XML.

Может ли кто-нибудь предоставить некоторые входные данные.

Спасибо

1 Ответ

0 голосов
/ 15 февраля 2019

Полагаю, вам нужны строки с теми же данными в интересующих вас столбцах, но с разными значениями в столбце IDDATE.

with
  t as (
    select
      111 as ID, '111R1' as IDLANE,
      xmltype(q'~
<Rowsets>
  <Rowset Name="Item">
    <Row>
      <IDLANE>111R1</IDLANE>
      <ID>111</ID>
      <ORDER>0111000</ORDER>
      <ITEM>000010</ITEM>
      <MATERIAL>000000000257</MATERIAL>
    </Row>
    <Row>
      <IDLANE>111R1</IDLANE>
      <ID>111</ID>
      <ORDER>0111000</ORDER>
      <ITEM>000020</ITEM>
      <MATERIAL>000000000258</MATERIAL>
    </Row>
  </Rowset>
</Rowsets>
~') as COMPONENT, timestamp'2019-02-10 10:00:00' as IDDATE from dual
    union all
    select
      111, '111R2',
      xmltype(q'~
<Rowsets>
  <Rowset Name="Item">
    <Row>
      <IDLANE>111R2</IDLANE>
      <ID>111</ID>
      <ORDER>0111000</ORDER>
      <ITEM>000010</ITEM>
      <MATERIAL>000000000257</MATERIAL>
    </Row>
    <Row>
      <IDLANE>111R2</IDLANE>
      <ID>111</ID>
      <ORDER>0111000</ORDER>
      <ITEM>000020</ITEM>
      <MATERIAL>000000000258</MATERIAL>
    </Row>
  </Rowset>
</Rowsets>
~'), timestamp'2019-02-10 11:00:00' from dual
    union all
    select
      222, '222R1',
      xmltype(q'~
<Rowsets>
  <Rowset Name="Item">
    <Row>
      <IDLANE>222R1</IDLANE>
      <ID>222</ID>
      <ORDER>0222000</ORDER>
      <ITEM>000010</ITEM>
      <MATERIAL>000000000257</MATERIAL>
    </Row>
    <Row>
      <IDLANE>222R1</IDLANE>
      <ID>111</ID>
      <ORDER>0222000</ORDER>
      <ITEM>000020</ITEM>
      <MATERIAL>000000000258</MATERIAL>
    </Row>
  </Rowset>
</Rowsets>
~'), timestamp'2019-02-10 13:00:00' from dual
    union all
    select
      222, '222R2',
      xmltype(q'~
<Rowsets>
  <Rowset Name="Item">
    <Row>
      <IDLANE>222R2</IDLANE>
      <ID>222</ID>
      <ORDER>0222000</ORDER>
      <ITEM>000010</ITEM>
      <MATERIAL>000000000259</MATERIAL>
    </Row>
  </Rowset>
</Rowsets>
~'), timestamp'2019-02-10 14:00:00' from dual
    union all
    select
      333, '333R1',
      xmltype(q'~
<Rowsets>
  <Rowset Name="Item">
    <Row>
      <IDLANE>333R1</IDLANE>
      <ID>333</ID>
      <ORDER>0333000</ORDER>
      <ITEM>000010</ITEM>
      <MATERIAL>000000000259</MATERIAL>
    </Row>
  </Rowset>
</Rowsets>
~'), timestamp'2019-02-10 18:00:00' from dual
  ),
  a as (
    select
      t."ID", t.IDLANE, t.IDDATE,
      count(*) over (
        PARTITION BY t."ID", x."order", x.ITEM, x.MATERIAL
      ) as qnt
    from t,
      xmltable('//Row'
        passing t.component
        columns
          "order" varchar2(10) path 'ORDER',
          item varchar2(10) path 'ITEM',
          material varchar2(20) path 'MATERIAL') x
  )
select distinct
  "ID", IDLANE, to_char(IDDATE, 'yyyy-MM-dd hh24:mi:ss') as IDDATE
from a where qnt > 1;

Вывод:

+-----+--------+---------------------+
| ID  | IDLANE |       IDDATE        |
+-----+--------+---------------------+
| 111 | 111R2  | 2019-02-10 11:00:00 |
| 111 | 111R1  | 2019-02-10 10:00:00 |
+-----+--------+---------------------+

Протестируйте его онлайн с db <> fiddle .

...