在连接两个XMLTable时选择不同的元素

时间:2016-11-03 11:54:09

标签: sql oracle xpath oracle-sqldeveloper xmltable

我有一张表ATTR_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

这是因为我们在表L_NAME_N的列ATTR_MASTER中有重复的元素,这就是为什么在select语句的where子句中,每个元素都被认为是两次,因为在{ {1}},我们有两个“w”元素,每个元素的值在输出中打印四次。 但我需要以下结果,

XML

行的顺序可能在输出中有所不同,这不是问题,但我只需要这些行。我再次无法更改表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,但它不起作用。我哪里错了?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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