1 select a.* , ROWNUM rownum_ from v_test a
2 select a.* from v_test av_test 是个视图包括多个排序,多个查询条件 及嵌套视图
令人不解上面两个查询 查出的结果数 1 > 2 v_test 形如:
WHERE ( ( 条件 and 条件 ) AND ( 条件1 and 条件 2 and 条件 3 ))
ORDER BY column1 ASC, column2 ASC, column3 ASC;红色部分压根没起作用 崩溃啊!!!!!
很急,谁能解决+200分explan 走的是 sort order by
到底是哪些条件不起作用了?
反正里面都是AND的关系,为什么要加那么多括号呢?
直接
WHERE 条件1 and 条件 2 and 条件 3
1 select a.* , ROWNUM rownum_ from v_test a
2 select a.* from v_test a加了rownum_ 的查询结果错了 多出了几条
而这几条是红色条件限制的 总的说 rownum 影响了 查询结果 不是顺序不对
是结果压根就不对令该sql 是动态生成的 所以不太规整
如果不一样,那可能原始数据有变化 这种低级错误 不要考虑了
explan 看的到么? 跨站看不到?
rownum 影响了 查询结果 不是顺序不对
是结果压根就不对
v_test 视图比较复杂,还有机密之嫌
因此没贴
(C) 版权所有 1985-2001 Microsoft Corp.C:\Documents and Settings\Administrator>SQPPLUS
'SQPPLUS' 不是内部或外部命令,也不是可运行的程序
或批处理文件。C:\Documents and Settings\Administrator>SQLPLUSSQL*Plus: Release 10.2.0.1.0 - Production on 星期六 3月 28 16:10:24 2009Copyright (c) 1982, 2005, Oracle. All rights reserved.请输入用户名: SYSTEM
输入口令:连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining optionsSQL> CREATE OR REPLACE VIEW V_TEST AS SELECT * FROM TEST WHERE DW<>'A';视图已创建。SQL> SELECT * FROM V_TEST;DW RQ
---------- --------------
B 26-3月 -09
B 23-3月 -09
C 23-3月 -09
C 27-3月 -09SQL> SELECT A.*,ROWNUM ROWNUM_ FROM V_TEST A;DW RQ ROWNUM_
---------- -------------- ----------
B 26-3月 -09 1
B 23-3月 -09 2
C 23-3月 -09 3
C 27-3月 -09 4SQL>也没有出现你说的错误呀?可能还是你哪个地方不小心搞错了,比如说你SQL语句生成的有问题,覆盖视图的时候没加REPLACE,你再做试验的时候,有人修改了数据而你不知道等等。
要相信ORACLE,没那么多BUG的
我给你发消息了 你看到了么
bug 的可能很小
但确实有这个问题
我也在想办法模拟
只是特殊的情况才会发生这中情况
上线说 好吧
如果有需要,那么你就用over()分析函数来实现替代
如果有需要,那么你就用over()分析函数来实现替代
--原sql 很复杂,放到视图中 测试方便些
xlongbuilder 2009年03月28日 16点48分28秒 说:
这个问题我觉得比较蹊跷,其实这是由分页引起的 分页采用标准的 三层嵌套,但查询结果出错造成严重问题
同时 只是在复杂查询才会发生这种情况 很是郁闷
CREATE OR REPLACE FUNCTION GG(S INT, E INT) RETURN SYS_REFCURSOR AS
R_C SYS_REFCURSOR;
BEGIN
OPEN R_C FOR 'SELECT ename,empno
FROM SCOTT.EMP
WHERE ROWID IN (SELECT RID
FROM (SELECT ROWNUM RNO, ROWID RID
FROM (SELECT ROWID
FROM SCOTT.EMP
ORDER BY ENAME)
WHERE ROWNUM <= :E)
WHERE RNO >= :S)'
USING E, S;
RETURN R_C;
END;
/DECLARE
r_c SYS_REFCURSOR;
v_c1 VARCHAR2(10);
v_c2 VARCHAR2(10);
BEGIN
r_c:=gg(2,6);
LOOP
FETCH r_c INTO v_c1,v_c2;
EXIT WHEN r_c%NOTFOUND;
dbms_output.put_Line(v_c1||'-'||v_c2);
END LOOP;
CLOSE r_c;
END;
/