Oracle版本是10.2.0.1.0,表结构和数据如下:CREATE TABLE T1(
  A  NUMBER(10),
  B  NUMBER(10)
);CREATE TABLE T2(
  B  NUMBER(10),
  C  NUMBER(10)
);CREATE TABLE T3(
  C  NUMBER(10)
);INSERT INTO T1(A, B) VALUES(100, 1);
INSERT INTO T1(A, B) VALUES(1, 2);
INSERT INTO T2(B, C) VALUES(2, 2);
INSERT INTO T2(B, C) VALUES(1, 1);
INSERT INTO T3(C)    VALUES(2);
COMMIT;下面两句SQL执行结果不一致:
SQL1:
SELECT (SELECT MAX(A)
          FROM ((SELECT T1.A
                   FROM T1, T2
                  WHERE T2.C = T3.C
                    AND T1.B = T2.B) 
                 UNION (SELECT NULL AS A FROM dual)
               )
       )
  FROM T3;SQL2:
SELECT (SELECT MAX(A)
          FROM ((SELECT T1.A
                   FROM T1, T2
                  WHERE T2.C = T3.C
                    AND T1.B = T2.B) 
--                 UNION (SELECT NULL AS A FROM dual)
               )
       )
  FROM T3;求助~~~~~~~~~~~~~~~~~~~~~

解决方案 »

  1.   

    看了半天没看出来两句SQL有什么差别
      

  2.   

    楼上的... 下面那句把 union给注释掉了....不知道楼主想说什么
      

  3.   

    我想问的是,为什么Union一个空之后结果就不一样了?
      

  4.   

    帮你测试了一下,有union和没有union不一样的,虽然union的是null值.请看以下代码:
    SQL> select count(*) from test;  -- test表中的只有4条数据.  COUNT(*)
    ----------
             4SQL> select count(*) from (select id from test union select null from dual);   COUNT(*)
    ----------
             5     -- 使用union null后再count,结果为5. 
      

  5.   

    但是Union一个空之后,Max值都变掉了,想不通 -_-|||   
    不知道是不是用了最外层T3表的关系
      

  6.   

    确实有点奇怪,
    这个或许是Oracle的BUG,期待庄稼出来给个权威的解释.这个问题和6楼兄弟说的根本不是一码事
      

  7.   

    我也觉得应该是Oracle的Bug,同期待权威解释
      

  8.   

    楼上的,你在sql server上面测试一下看看结果是不是一样?
      

  9.   

    SQL1:
    SELECT (SELECT MAX(A)
              FROM ((SELECT T1.A
                      FROM T1, T2
                      WHERE T2.C = T3.C
                        AND T1.B = T2.B)
                    UNION (SELECT NULL AS A FROM dual)
                  )
          )
      FROM T3;SQL2:
    SELECT (SELECT MAX(A)
              FROM ((SELECT T1.A
                      FROM T1, T2
                      WHERE T2.C = T3.C
                        AND T1.B = T2.B)
    (看这里!!!)--                UNION (SELECT NULL AS A FROM dual)
                  )
          )
      FROM T3; 
      

  10.   

    你那两句我用pl/sql为什么不能执行? 报错啊:ORA-00904: "T3"."C": 标识符无效
      

  11.   

    搂主 的SQL 执行不了,提示T3 为无效的标识符,要在最内层的查询加上FROM T3
      

  12.   

    1 你的sql是错误的
    2 修改一下执行得到的结果ORA-24347: Warning of a NULL column in an aggregate function
    ========
    事实证明,这样查询是会发生错误的