有一个表的字段XML_INFO是Xml消息体,使用
SELECT
KEY, USER_URI,
EXTRACTVALUE(VALUE(X), '/user-profile/@open-level'),
EXTRACTVALUE(VALUE(X), '/user-profile/display-name'),
EXTRACTVALUE(VALUE(X), '/user-profile/birth-date'),
EXTRACTVALUE(VALUE(Y), '/name/given-name')
FROM AA_XML,
TABLE(XMLSEQUENCE(EXTRACT(XML_INFO, '/user-profiles/user-profile'))) X,
TABLE(XMLSEQUENCE(EXTRACT(XML_INFO, '/user-profiles/user-profile/name'))) Y
查询结果为空,实际上表里面是有N条满足条件的记录的,但使用SELECT
KEY, USER_URI,
EXTRACTVALUE(VALUE(X), '/user-profile/@open-level'),
EXTRACTVALUE(VALUE(X), '/user-profile/display-name'),
EXTRACTVALUE(VALUE(X), '/user-profile/birth-date'),
FROM AA_XML,
TABLE(XMLSEQUENCE(EXTRACT(XML_INFO, '/user-profiles/user-profile'))) X
就没有问题,可以查询出多条记录,请高人看看是怎么回事??
SELECT
KEY, USER_URI,
EXTRACTVALUE(VALUE(X), '/user-profile/@open-level'),
EXTRACTVALUE(VALUE(X), '/user-profile/display-name'),
EXTRACTVALUE(VALUE(X), '/user-profile/birth-date'),
EXTRACTVALUE(VALUE(Y), '/name/given-name')
FROM AA_XML,
TABLE(XMLSEQUENCE(EXTRACT(XML_INFO, '/user-profiles/user-profile'))) X,
TABLE(XMLSEQUENCE(EXTRACT(XML_INFO, '/user-profiles/user-profile/name'))) Y
查询结果为空,实际上表里面是有N条满足条件的记录的,但使用SELECT
KEY, USER_URI,
EXTRACTVALUE(VALUE(X), '/user-profile/@open-level'),
EXTRACTVALUE(VALUE(X), '/user-profile/display-name'),
EXTRACTVALUE(VALUE(X), '/user-profile/birth-date'),
FROM AA_XML,
TABLE(XMLSEQUENCE(EXTRACT(XML_INFO, '/user-profiles/user-profile'))) X
就没有问题,可以查询出多条记录,请高人看看是怎么回事??
是不是还有什么地方不一样呢?
和X连接起来,当然没有数据了。赫赫。
除非你使用了左外连接,完全连接才有记录。
在其中一个表里面没有数据的情况下,自然连接得不到记录的。
这个就是你的两个句子,一个可以取到记录,一个不可以的原因。不管是XML数据库,还是大家常见的数据库,道理都是一样的。
可是实际上两个数据库上的查询语句都是一样的,select ... from AA_XML,
TABLE(XMLSEQUENCE(EXTRACT(XML_INFO, '/user-profiles/user-profile'))) X,
TABLE(XMLSEQUENCE(EXTRACT(XML_INFO, '/user-profiles/user-profile/name'))) Y 难道是oracle有什么设置?对于from A,B这样的语句默认处理方式不一样???
这个不是Oracle的设置。
而是SQL本身的语法。Select .. From A,B 这样的做法,当A,B两个表都有记录的时候,
比如说,
1.A里面有3条,B里面有2条,那么就会有3*2=6条记录。是一个笛卡尔积。 ------------ M1
2.A里面有3条,B里面有0条,那么就会有3*0=0条记录。 ------------ M2Select .. From A Left Outer Join B这样的做法,不管B里面有几条,就算一条都没有,也会显示出3条记录。------------ M3
Select .. From A 这样的做法,也不会管B里面有几条,就算一条都没有,也会显示出3条记录。 ------------ M4这次你的做法,看起来就是缺少了一个Name标签,换句话说,实际上就等于。B里面有记录还是没有记录。
对于你的第一种做法:
你可以选择出来记录的原因,因为你有Name标签,而且有记录,就是M1状况。
你不能选择出来记录的原因,因为你每有Name标签,就等于没有记录,就是M2状况。对于你的第二种做法:
他们就是M4情况,怎么都不会受到B的影响的。
在有Name标签的时候,能够选择出记录。
怎么变成了[/user-profile/display-name]。假如是[/user-profile/display-name]没有的话,还影响不到你抽取出来的数据的件数。你不是也说了,你的第二种做法是可以取得出记录嘛?不知道解释了这么多,LZ是不是明白了。赫赫。
数据中只有'/user-profile/display-name'这个标签,[/user-profiles/user-profile/name]这个标签是没有的。
关键是为何在另一台数据库中能查询出来?
都是有'/user-profile/display-name'这个标签,没有[/user-profiles/user-profile/name]这个标签。2。同样的SQL是说
不是你最初说的2个SQL,而都是你写的第一个SQL句子。是这样的问题嘛?
和你的最初的表述差很多呀。据我所知,应该是得不到记录的才是正确的。得到记录的,我倒是觉得奇怪。
缺少了[/user-profiles/user-profile/name]这个标签,
等于让Y就是一个空表。语句中的 EXTRACTVALUE(VALUE(Y), '/name/given-name')
根本没有办法找到的。
因为没有[/user-profiles/user-profile/name/given-name]这个标签。Oracle还没有这么聪明可以自动识别到这个地步吧。赫赫。
原因很简单。假如在两个标签下存在同样名称的子标签,突然少了上层标签,怎么来分辨呢。可不可以给出你的XML的部分数据,我在我这里看看呢。
不过,我还是认为,真的和你说的一样的话,应该是找不出来的。