连接两个 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
我有一个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