我有一张表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
,但它不起作用。我哪里错了?
答案 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