连接两个 XMLTable 时选择 Distinct 元素

Choosing Distinct elements while joining two XMLTables

我有一个tableATTR_MASTER,内容如下:

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 查询如下:

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

这是因为我们在 table ATTR_MASTER 的列 L_NAME_N 中有重复的元素,这就是为什么在 select 语句的 where 子句中,每个元素被考虑两次,因为在 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

输出中的行顺序可能不同,这不是问题,但我只需要这些行。同样,我无法更改 table ATTR_MASTER 的内容。我也试过 SELECT DISTINCT...,但它不起作用。我哪里错了?

ID 不同,DISTINCT 不起作用,您需要 ID 字段吗?

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