select (select b.字段 from 
(select 字段 from 表1 where 表1.列 = 表2.列) b
) c
 from 表2 ;这种sql在32位的oracle里面执行没有问题,在64位就报 表2.列 不存在,这玩意咋解决啊...不能执行的环境:
windowsserver2008
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
可以执行的环境:
windowsserver2003
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

解决方案 »

  1.   

    嘿嘿,1楼又是你啊,谢谢你了,才帮我解决了一个问题.
    这个问题真是存在,一层嵌套
    select   (select 字段 from 表1 where 表1.列 = 表2.列) b from 表2 ;
    没有问题,两层就不行了.真是很痛苦.
      

  2.   

    语句是没有问题,我是copy执行的,32位可以,64位不行。
    http://www.oracle.com.cn/archiver/?tid-128450.html 这里有位同行也是遇到了这个问题,可惜没人回答
      

  3.   

    我在“64位linux + oracle 11g”上测试是没问题的,按说这个也不应该和多少位有关,要不再检查下语句看看。
      

  4.   

    语句真不知道如何检查了,因为我装了两个机器,一个是64位的,一个是32位的,在进行32位迁移至64位上时,提示这个视图错误(表结构在之前已经迁移了,因此不用怀疑表结构或字段名等问题),我就试试直接执行select语句,32位能执行成功,copy到64位机器上就不行。开始还以为是客户端问题,后来也试了直接在服务器sqlplus上执行,也是同样问题。
    我不是说和位数相关,我的意思是这个64位的oracle是不是有这个bug。我也下了个11g,准备装个11g测一测。
    楼上的兄弟,做过10迁移到11没?我昨天试用32位oracle10g的exp导出,在64位机器上导入这个dmp文件,有几个表结构死活导不进去,搞不懂为什么,都是很简单的表,而且都是空表只有结构,也没用到自定义对象,字段类型都是普通类型。后来只有手工利用plsqldev来做,有点郁闷。
      

  5.   

    根据 oracle 给出的解释,sql 语句中子查询引用表名只允许一层嵌套。两层的是个 bug。
    http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1853075500346799932#1859169400346361423
      

  6.   

    擦,这个特性我实在是很喜欢啊,而且也不明白会引起oracle啥地方不适,为啥要把这种写法看成是bug,逼着多做视图么?
      

  7.   

      sql 语句中子查询引用表名只允许一层嵌套。两层的是个 bug。
      

  8.   

    不晓得为啥要认为其是个BUG?原因何在?sqlserver反正是支持这样。
      

  9.   

    原自 ANSI SQL 标准微软向来是标准终结者:)
      

  10.   

    我的机器是windows7 X64+oracle_10.2.0.4 X64,运行也没有问题,虽然我也安装了32位的客户端,不过我启动的是64位的sqlplusOracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing optionsSQL> select (select (select ID from city_code a where a.id=b.city_id ) from rep_
    statusmsg b where b.city_id=c.id)
      2  from  city_code c ;(SELECT(SELECTIDFROMCITY_CODEAWHEREA.ID=B.CITY_ID)FROMREP_STATUSMSGBWHEREB.CITY_--------------------------------------------------------------------------------                                                                               1                                                                               2                                                                               3
    SQL>
      

  11.   

    我试试装个64位的10.2.0.1.0试下看,我在windowsserver8上装10.2.0.4.0是肯定不行的,不管是客户端32位sqlplus还是服务端64位sqlplus执行都会报无效列名。谢谢各位了,反正咱们也不能要求别人改,只有自己想办法适应了。
    xman_78tom:ANSI SQL 标准不管是哪个版本都不支持 sql 语句中子查询引用表名进行多层嵌套吗?那我个人认为这个标准不够好,sqlserver改得好!谢谢,这个贴再挂两天,供大家讨论一下,周六结贴。谢谢各位!
      

  12.   

    我的是windows 2008 server(64) R2+ oracle11.1.0.7.0 可以执行多层嵌套呀。
      

  13.   

    这位仁兄,我的报如下错误:
    正在检查操作系统要求...
    要求的结果: 5.0,5.1,5.2,6.0 之一
    实际结果: 6.1
    检查完成。此次检查的总体结果为: 失败 <<<<
    问题: Oracle Database 11g 未在当前操作系统中经过认证。
    建议案: 确保在正确的平台上安装软件。原来服务器是6.1版本7200. 我晕死啊,10g10.2.0.1.0也只支持6.0以下,oracle11.1.0.7.0也一样.我咋样才能使用这个oracle所谓的bug呢?
      

  14.   

    不支持windows2008 6.1版本7200的oracle版本有:
    10203_vista_w2k8_x86_production_db;
    102010_win64_x64_database;
    oracle10.2.0.1.0_x32;
    win64_11gR1_database_111070;两个32位的纯属测测,别拍砖.
      

  15.   

    兄弟 ,最后面的 from 表2  错了吧 
    SELECT * 
      FROM (
          SELECT B.VALUE 
            FROM (
                  SELECT * 
                    FROM (
                         WITH 
                         TAB1 AS
                              (SELECT 'A' ID,'DKJSALK' NAME FROM DUAL UNION ALL
                              SELECT 'B' ID,'TERSDSK' NAME FROM DUAL UNION ALL
                              SELECT 'C' ID,'ERSDSDS' NAME FROM DUAL),
                         TAB2 AS 
                              (SELECT 'A' ID,2322 VALUE FROM DUAL UNION ALL
                              SELECT 'A' ID,8980 VALUE FROM DUAL)
                       SELECT TAB2.*,
                              TAB1.NAME 
                         FROM TAB1,TAB2 
                        WHERE TAB1.ID = TAB2.ID) 
                 ) B 
           ) C
      

  16.   

    这个这样吧,我给个测试语句。最新测试结果表示 win64_11gR2_database_1of211.2.0.1.0 也不支持2层以上.
    给大伙一个测试语句:
    select (select * from (select a.dummy from dual a where a.dummy = dual.dummy)) from dual;
    有环境的麻烦帮忙测试下哪些个64位的版本能支持,麻烦将操作系统版本和oracle版本报上来,报小版本号.目前只发现32位下oracle10.2.0.1.0_x32可以;还有一位仁兄说
    windows 2008 server(64) R2+ oracle11.1.0.7.0 也可以,但估计其操作系统版本肯定在6.1以下.
      

  17.   

    windows 2008 server(64) R2(6.0,6.1) 版本上,能装上的oracle10g以上版本,包括10.2.0.4\10.2.0.3\11.1.0.7.0\11.2 都不能执行
    select (select * from (select a.dummy from dual a where a.dummy = dual.dummy)) from dual;且windows 2008 server(64) R2(6.0,6.1) 无论装哪个10g以上版本,都无法成功安装EM,提示EM配置失败,需手工配置,服务里面也没这个服务,很是崩溃.
    书到用时方恨少啊...
      

  18.   

    还是改sql算了,向ANSI SQL 标准看齐。
    oracle用起来确实没有sqlserver方便。
    顺带发现一个问题:从9i开始就号称面向对象,那么如何定义表类型?sqlserver有表值函数,在oracle实现时就只能拐个弯,用类型数组的方式来实现(虽然定类的时候关键字还是table,但其实只能按数组的语法去编辑数据),这点看来实在是有点伪面向对象了。
    还有一点就是oracle的临时表实在是没有sqlserver的临时表用起来方便,临时表不能直接在代码中进行定义结构(动态创建是可以,可惜返回的时候如果是基于事务的,代码一结束就销毁了,客户端无法接收;基于连接的就实在是无法控制在多个不同对象中的临时表名称),必须先行定义。转到不同DB的时候工作量实在是太大,真不知道那些支持多DB的软件是怎么弄的,可能是人多力量大吧。
    一点小看法,拍砖的尽管拍,不怕人批评,就怕高手们不出声。
    谢谢楼上的诸位了,之前说好的,下午结贴。