SELECT a.* FROM (SELECT ROWNUM AS RO,OP.* FROM OP) A,(SELECT ROWNUM AS RO ,OP FROM OP) B WHERE A.RO = B.RO + :n AND ROWNUM < 11
是关于分页的
rownum 和op是什么意思啊 ()里面是不是两个集合连接的意思啊

解决方案 »

  1.   

    rownum是结果集的行号。
    括号里的部分相当于将表中记录依次编号。
      

  2.   

    还是没明白 op是当前游标指向的记录吧 B是查询的什么东东啊
      

  3.   

    OP是表名;A和B是子查询的别名,分别代表两个括号里的内容。
      

  4.   

    SELECT a.* FROM (SELECT ROWNUM AS RO,OP.* FROM OP) A,//这里OP为表名还说的通
    (SELECT ROWNUM AS RO ,OP FROM OP) B //这里OP为什么就真不知道了
    WHERE A.RO = B.RO + :n AND ROWNUM < 11 
      

  5.   

    我把delphi源代码贴出来吧,unit Unit1;interfaceuses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, DB, DBTables, Grids, DBGrids,math, ComCtrls;type
    TForm1 = class(TForm)
        DataSource1: TDataSource;
        DBGrid1: TDBGrid;
        Query1: TQuery;
        Query2: TQuery;
        Edit1: TEdit;
        Button1: TButton;
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        Label4: TLabel;
        UpDown1: TUpDown;
        procedure Button1Click(Sender: TObject);
        procedure Label4Click(Sender: TObject);
        procedure Label3Click(Sender: TObject);
        procedure ExButton1Click(Sender: TObject);
    private
        { Private declarations }
    public
        { Public declarations }
    end;var
    Form1: TForm1;
    Total,PageSize,Page: integer;
    p : real;
    implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);//轉到第n頁beginif (Edit1.Text = '') or (StrToFloat(Edit1.Text) < 0 )then
        Exit;
    DataSource1.DataSet := Query1;
    with query2 do
    begin
        Close;
        SQL.Clear;
        SQL.Add('SELECT COUNT(*) COUNT FROM OP ');
        Open;
        Total := FieldByName('COUNT').AsInteger;
        PageSize := 10;//10條記錄/頁
        p := Total / PageSize;
        Page := Ceil(Total/PageSize);//共多少頁
    end;
    Query1.Close;
    Query1.ParamByName('n').AsInteger := (StrToInt(Edit1.text) - 1) * 10;
    Query1.Open;end;procedure TForm1.Label4Click(Sender: TObject);//下一頁
    begin
    DataSource1.DataSet := Query1;
    Query1.Close;
    Query1.ParamByName('n').AsInteger := StrToInt(Edit1.text) * 10;
    Query1.Open;
    Edit1.Text := IntToStr(StrToInt(Edit1.Text) + 1);
    end;procedure TForm1.Label3Click(Sender: TObject);//上一頁
    begin
    if StrToInt(Edit1.Text) < 2 then
        Exit;
    DataSource1.DataSet := Query1;
    Query1.Close;
    Query1.ParamByName('n').AsInteger := (StrToInt(Edit1.text) - 2) * 10;
    Query1.Open;
    Edit1.Text := IntToStr(StrToInt(Edit1.Text) - 1);
    end;*****************************************************当初太粗心,记笔记一点都没用用心,导致朋友们都看不懂,现在补充下:Query1链接正确后设置SQL属性:(这些都是Oracle的语句,使用SQL的朋友需要变通语句.)SELECT a.* FROM (SELECT ROWNUM AS RO,OP.* FROM OP) A,(SELECT ROWNUM AS RO ,OP FROM OP) B WHERE A.RO = B.RO + :n AND ROWNUM < 11
    我也怀疑搞错了
      

  6.   

    猜测 第二个子查询的SELECT字段 应该和第一个的一样
    也就是 应该是:
    SELECT a.* FROM (SELECT ROWNUM AS RO,OP.* FROM OP) A,(SELECT ROWNUM AS RO ,OP.* FROM OP) B WHERE A.RO = B.RO + :n AND ROWNUM < 11原句估计写错了
      

  7.   

      
    一个分页存储过程  procedure sp_Page(p_PageSize int,          --每页记录数
                      p_PageNo int,            --当前页码,从 1 开始
                      p_SqlSelect varchar2,    --查询语句,含排序部分
                      p_SqlCount varchar2,     --获取记录总数的查询语句
                      p_OutRecordCount out int,--返回总记录数
                      p_OutCursor out sys_refcursor)
      as
          v_sql varchar2(3000);
          v_count int;
          v_heiRownum int;
          v_lowRownum int;
      begin
        ----取记录总数
        execute immediate p_SqlCount into v_count;
        p_OutRecordCount := v_count;
        ----执行分页查询
        v_heiRownum := p_PageNo * p_PageSize;
        v_lowRownum := v_heiRownum - p_PageSize +1;    v_sql := 'SELECT *
                  FROM (
                        SELECT A.*, rownum rn
                        FROM  ('|| p_SqlSelect ||') A
                        WHERE rownum <= '|| to_char(v_heiRownum) || '
                       ) B
                  WHERE rn >= ' || to_char(v_lowRownum) ;
                  --注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn    OPEN p_OutCursor FOR  v_sql;  end sp_Page;
      

  8.   

    我综合以上几位的纪录得出结论:
          取出满足条件当前当前页的记录就是: 该记录在所有记录的行数=页数*每页的记录数+当前页在该页的行数
           所以第一个op是指所有记录,第二个op是从当前记录指针以上的集合中取记录
          由此可见oracle很强大啊 短短一句用sql写了那么多 听说sql2005也引进了rownum
         不知道用access实现要写多少啊
      

  9.   

    我换了个写法
          SELECT a.* FROM (SELECT ROWNUM ,OP.* FROM OP) A,(SELECT ROWNUM AS RO ,OP.* FROM  A )B WHERE A.RO = B.RO + :n AND RO < 11     
      

  10.   


    写sql要这样写,阅读起来容易一些
    SELECT a.* FROM 
           (SELECT ROWNUM AS RO,OP.* FROM OP) A,
           (SELECT ROWNUM AS RO ,OP FROM OP) B 
    WHERE 
          A.RO = B.RO + :n 
          AND 
          ROWNUM < 11
      

  11.   

    看了一下,第一个op应该是表中的所有记录,第二个op是在前面生成表op的基础上所作的操作
      

  12.   

    :n 是什么写法???
    oracle中没见到过啊?
    你这个是不是在存储过程里面的?
    如果是新插入的记录,好像应该是写成.NEW吧?
      

  13.   


    :n 是什么写法??? 
    oracle中没见到过啊? 
    你这个是不是在存储过程里面的? 
      

  14.   

    rownum是行数,op是一个表,这个语句应该是分页用到的吧
      

  15.   

    我修改了下:
    SELECT a.*
      FROM (SELECT ROWNUM AS RO, spyinfos.* FROM spyinfos) A,
           (SELECT ROWNUM AS RO, spyinfos.* FROM spyinfos) B
     WHERE A.RO = B.RO + :n
       AND ROWNUM < 11
    但这样是报错的。。我感觉你的
    SELECT a.* FROM 
          (SELECT ROWNUM AS RO,OP.* FROM OP) A, 
          (SELECT ROWNUM AS RO ,OP FROM OP) B 
    WHERE 
          A.RO = B.RO + :n 
          AND 
          ROWNUM < 11 
    其中红色的OP是不是Op表中的一个op字段
      

  16.   

    SELECT a.* 
    FROM (SELECT ROWNUM AS RO,
                 tmpsms.* 
          FROM tmpsms) A,
         (SELECT ROWNUM AS RO ,
                 lot_no 
          FROM tmpsms) B 
    WHERE A.RO = B.RO + :n 
    AND ROWNUM < 11;
    --------------------------------------------------------------
    :n 已翻过的行数 也就是 count_per_page * (page_index - 1)
    rownum是oracle的一个内置值,标示记录行数.可以理解为结果集序号.
    在oracle中最常用的是 rownum < N,或者rownum = 1,其他的基本得不出结果.
    OP应该是表名.
      

  17.   

    oracle写分页时用rownum,具体取哪些行要事先算出来;
    看hibernate的资料是这么写的:
    select * from (select * from (select rownum as ro,table.* from table ) where ro<:l1) where ro >:l2;
    据说这么写执行效率比较高,具体原因是什么没研究;你可以参考一下反正我以前是这么写的
    select * from (select rownum as ro,table.* from table ) where ro<:l1 and ro >:l2;其中l1 和 l2 是具体的行数
      

  18.   

    我回去想了想感觉自己脑袋被驴踢了
          想想高中的数列算是白学了:
          某页的记录的满足条件:
            绝对行数=(页数-1)*每页的记录数+{1,2,3,4,5,6,7,8,9,10}(第二次查询的rownum为集合的任意取值)
          这里ParamByName('n').AsInteger := (StrToInt(Edit1.text) - 1) * 10;就是前半部分了正确写法:      
    SELECT a.* FROM (SELECT ROWNUM AS RO,OP.* FROM OP) A,(SELECT ROWNUM AS RO FROM OP) B WHERE A.RO = B.RO + :n AND ROWNUM < 11 
         注意where 条件的作用域 ,同时作用于逗号隔开的两个子句 ,也就是第一个select和第三个select 
    也就是第二个查询rownum到10就终止了第二个查询实际的结果只是为了获得{1,2,3,4,5,6,7,8,9,10}
    A,B的写法叫sql的自我连接,也就是对同一数据库查询结果两个子集的连接 ,这才是正确理解       对于access数据库其实也有获得行号的办法只不过效率很低要用累加 baidu了一个例子:
           select   (   select   count(*)   from   proDetails
          where proID<=a.proID ) as id,   proID from   
          proDetails   a   order   by proID ASC    
      

  19.   

    我觉得第二个也应该表示op.*,ls的我的写法还是漏了,加op.*的目的游标移动rownum才能累加吧否则rownum=1就停止了SELECT a.* FROM 
           (SELECT ROWNUM AS RO,OP.* FROM OP) A,
           (SELECT ROWNUM AS RO ,OP.* FROM OP) B 
    WHERE 
          A.RO = B.RO + :n 
          AND 
          ROWNUM < 11
    直接用op好象说不通的 ,op指示的是什么了 ,第一个字段吗,hongqi162解释下?
      

  20.   

    我在access里面用select op from op 它跳出了输入参数值 
    没有输入直接确定得到了下面的东西
      

  21.   

    :n是delphi中dataset的一个邦定参数,我给你发的那个分页存储过程很复杂么?
      

  22.   

    select op.* from op 
      

  23.   

    select * from (select rownum as orm,c.* from rpt_mlog_statistic c where c.bsflag='0') a,(select rownum as orm,c.* from rpt_mlog_statistic c where c.bsflag='0') b
     where a.orm=b.orm+200 and rownum<=100这是按你上面改的!!每页显示100行!!,从200行取数!
    也许对你有用,
      

  24.   

    select * from (select rownum as orm,c.* from rpt_mlog_statistic c where c.bsflag='0') a,(select rownum as orm,c.* from rpt_mlog_statistic c where c.bsflag='0') b
     where a.orm=b.orm+200 and rownum<=100这是按你上面改的!!每页显示100行!!,从200行取数!
    也许对你有用,
      

  25.   

    据说Oracle是强大的。我学习呀!
      

  26.   

    说Oracle是强大的。我学习呀!
      

  27.   

    猜测 第二个子查询的SELECT字段 应该和第一个的一样 
    也就是 应该是: 
    SELECT a.* FROM (SELECT ROWNUM AS RO,OP.* FROM OP) A,(SELECT ROWNUM AS RO ,OP.* FROM OP) B WHERE A.RO = B.RO + :n AND ROWNUM < 11 原句估计写错了
      

  28.   

    http://www.189qq.cn/soft?35513.htm 
    老顾客了!照顾一下!
      

  29.   


    这是DELPHI的用法  在拼凑的 或 事先定义的SQL语句中起到了占位符的作用。