2016-11-03 6 views
0

У меня есть таблица ATTR_MASTER, которая имеет содержание следующим образом:Выбор различных элементов во время соединения двух XMLTables

ID L_NAME_N C_LEVEL 
1000 e1  D 
1001 e2  D 
1002 e3  D 
1003 e4  D 
1004 e1  D 
1005 e2  D 
1006 e3  D 
1007 e4  D 

Теперь я уверен, выполнение запроса на выборку следующим образом:

SELECT e.ID,x.EVALUE,z.VALUE_TYPE,x.w FROM ATTR_MASTER e, xmltable 
(
'//B/C/D/*[local-name(.)!=''w'' and text()]' 
    PASSING xmltype('<A><B><C><D><w>1L</w><e1>AMAR</e1><e2>AKBAR</e2><e3>1234</e3><e4>BIJAY</e4></D></C><C><D><w>1B</w><e1>ARTI</e1><e2>AKBAR</e2><e3>5678</e3><e4>BIJAY</e4></D></C></B></A>') 

COLUMNS 
EVALUE VARCHAR2(100) PATH './text()', 
L_NAME_EN VARCHAR2(50) PATH 'local-name(.)', 
w VARCHAR2(20) PATH './parent::*/w' 

)x LEFT OUTER JOIN 
XMLTABLE 

(
'//GetDataLookupValuesResponse/tuple/old' 
PASSING xmltype('<GetDataLookupValuesResponse><tuple><old><DataLookup><Key>e1</Key><Value>String</Value></DataLookup></old></tuple><tuple><old><DataLookup><Key>e2</Key><Value>String</Value></DataLookup></old></tuple><tuple><old><DataLookup><Key>e3</Key><Value>Number</Value></DataLookup></old></tuple><tuple><old><DataLookup><Key>e4</Key><Value>String</Value></DataLookup></old></tuple></GetDataLookupValuesResponse>') 

COLUMNS 
VALUE_TYPE VARCHAR2(50) PATH '//Value', 
C_KEY varchar2(50) PATH '//Key' 
)z ON x.L_NAME_EN=z.C_KEY 

where e.L_NAME_EN=x.L_NAME_EN; 

Выход Показанная

ID  EVALUE VALUE_TYPE W 
1004 AMAR String 1L 
1000 AMAR String 1L 
1005 AKBAR String 1L 
1001 AKBAR String 1L 
1006 1234 Number 1L 
1002 1234 Number 1L 
1007 BIJAY String 1L 
1003 BIJAY String 1L 
1004 ARTI String 1B 
1000 ARTI String 1B 
1005 AKBAR String 1B 
1001 AKBAR String 1B 
1006 5678 Number 1B 
1002 5678 Number 1B 
1007 BIJAY String 1B 
1003 BIJAY String 1B 

Это потому, что у нас есть повторяющиеся элементы в столбце L_NAME_N таблицы ATTR_MASTER, поэтому в предложении where оператора select каждый элемент рассматривается дважды и снова, так как в XML мы имеем два элемента «w», значение каждого элемента печатается четыре раза на выходе , Но мне нужен следующий результат,

ID  EVALUE  VALUE_TYPE  W 
1000 AMAR  String   1L 
1004 ARTI  String   1B 
1001 AKBAR  String   1L 
1005 AKBAR  String   1B 
1002 1234  Number   1L 
1006 5678  Number   1B 
1003 BIJAY  String   1L 
1007 BIJAY  String   1B 

Последовательность строк может изменяться в выходных данных, который не является проблемой, но мне нужна только эти строки. Снова я не могу изменить содержимое таблицы ATTR_MASTER. Также я пробовал SELECT DISTINCT..., но это не сработает. Где я ошибаюсь?

ответ

0

DISTINCT не работает, потому что ID отличается, вам нужно поле ID?

+0

Да, идентификатор подал также требуется – ArpanMona

+0

, то вы можете использовать функцию MAX и группу по – TheName

+0

так что ваш код должен выглядеть следующим образом TheName

0
SELECT max(e.ID),x.EVALUE,z.VALUE_TYPE,x.w FROM ATTR_MASTER e, xmltable 
(
'//B/C/D/*[local-name(.)!=''w'' and text()]' 
    PASSING xmltype('<A><B><C><D><w>1L</w><e1>AMAR</e1><e2>AKBAR</e2><e3>1234</e3><e4>BIJAY</e4></D></C><C><D><w>1B</w><e1>ARTI</e1><e2>AKBAR</e2><e3>5678</e3><e4>BIJAY</e4></D></C></B></A>') 

COLUMNS 
EVALUE VARCHAR2(100) PATH './text()', 
L_NAME_EN VARCHAR2(50) PATH 'local-name(.)', 
w VARCHAR2(20) PATH './parent::*/w' 

)x LEFT OUTER JOIN 
XMLTABLE 

(
'//GetDataLookupValuesResponse/tuple/old' 
PASSING xmltype('<GetDataLookupValuesResponse><tuple><old><DataLookup><Key>e1</Key><Value>String</Value></DataLookup></old></tuple><tuple><old><DataLookup><Key>e2</Key><Value>String</Value></DataLookup></old></tuple><tuple><old><DataLookup><Key>e3</Key><Value>Number</Value></DataLookup></old></tuple><tuple><old><DataLookup><Key>e4</Key><Value>String</Value></DataLookup></old></tuple></GetDataLookupValuesResponse>') 

COLUMNS 
VALUE_TYPE VARCHAR2(50) PATH '//Value', 
C_KEY varchar2(50) PATH '//Key' 
)z ON x.L_NAME_EN=z.C_KEY 

where e.L_NAME_EN=x.L_NAME_EN 

group by 
x.EVALUE, 
z.VALUE_TYPE, 
x.w