有一个表的字段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
就没有问题,可以查询出多条记录,请高人看看是怎么回事??

解决方案 »

  1.   

    发现规律了,查询不出的记录是因为name标签在xml消息体里面没有定义。如果定义了name标签就可以查询出来。很奇怪,同样的数据在另外一台数据库服务器上就可以。
      

  2.   

    没有定义name标签,等于没有记录呀。你可以找出来的服务器,我才是佩服。赫赫。
    是不是还有什么地方不一样呢?
      

  3.   

    楼上的,确实是这样的,只有name标签没定义,但其他标签及其父标签是有值的,这样查询出来的记录里面name字段是空就是了。其他地方都一样,建库的脚本都是一样的。
      

  4.   

    赫赫,那么你的given-name都定义在什么地方了呢?赫赫。
      

  5.   

    因为name标签没有定义,换句话说,就是y里面没有记录。
    和X连接起来,当然没有数据了。赫赫。
      

  6.   

    这个是SQL的基础,
    除非你使用了左外连接,完全连接才有记录。
    在其中一个表里面没有数据的情况下,自然连接得不到记录的。
    这个就是你的两个句子,一个可以取到记录,一个不可以的原因。不管是XML数据库,还是大家常见的数据库,道理都是一样的。
      

  7.   

    你说的确实有道理,
    可是实际上两个数据库上的查询语句都是一样的,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这样的语句默认处理方式不一样???
      

  8.   

    赫赫,看来你还是没有明白。
    这个不是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的影响的。
      

  9.   

    你不是想说,你的查询语句一样,而且数据也一样吧。都是没有Name标签的。这样的话,我想你再确认一下比较好。在没有Name标签的时候,就应该都选择不出记录。
    在有Name标签的时候,能够选择出记录。
      

  10.   

    就是啊,数据都是一样的,只有'/user-profile/display-name'这个标签,其它的都没有,但一个数据库可以查询到记录,另外一个就是查询不出记录
      

  11.   

    赫赫,不是这个[/user-profiles/user-profile/name]没有吗?
    怎么变成了[/user-profile/display-name]。假如是[/user-profile/display-name]没有的话,还影响不到你抽取出来的数据的件数。你不是也说了,你的第二种做法是可以取得出记录嘛?不知道解释了这么多,LZ是不是明白了。赫赫。
      

  12.   

    我明白你说的,可实际情况就是这样
    数据中只有'/user-profile/display-name'这个标签,[/user-profiles/user-profile/name]这个标签是没有的。
    关键是为何在另一台数据库中能查询出来?
      

  13.   

    我们再确认一下。在两个机器上,同样的数据同样的SQL,一个机器上面得到了结果,一个没有得到结果。1。同样的数据是说
       都是有'/user-profile/display-name'这个标签,没有[/user-profiles/user-profile/name]这个标签。2。同样的SQL是说
       不是你最初说的2个SQL,而都是你写的第一个SQL句子。是这样的问题嘛? 
      

  14.   

    兜了这么大圈子,才明确LZ到底想要什么。
    和你的最初的表述差很多呀。据我所知,应该是得不到记录的才是正确的。得到记录的,我倒是觉得奇怪。
    缺少了[/user-profiles/user-profile/name]这个标签,
    等于让Y就是一个空表。语句中的  EXTRACTVALUE(VALUE(Y),   '/name/given-name') 
    根本没有办法找到的。
    因为没有[/user-profiles/user-profile/name/given-name]这个标签。Oracle还没有这么聪明可以自动识别到这个地步吧。赫赫。
    原因很简单。假如在两个标签下存在同样名称的子标签,突然少了上层标签,怎么来分辨呢。可不可以给出你的XML的部分数据,我在我这里看看呢。
    不过,我还是认为,真的和你说的一样的话,应该是找不出来的。