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是什么意思啊 ()里面是不是两个集合连接的意思啊
是关于分页的
rownum 和op是什么意思啊 ()里面是不是两个集合连接的意思啊
解决方案 »
- ADOQuery.FieldByName 都有哪些属性 例如value asstring等 ,都是有什么作用?
- 请问:下面的这是哪有毛病的了?
- To SQL字段与Oracle字段类型的问题
- 图形处理问题,100分求助!!!
- ◇◆◆◇如何删除在win2K下 “服务”上的的程序记录??
- 50分的问题:ClientDataset的SQL语句如何实现?
- 一个迄今为止最难解决的问题——关于VCD(DAT)文件剪切一个片段,并保存。谢谢!
- 用什么方法让combobox只能选择,不能输入?
- 将listbox1中每一行的值,写入到自定义文本文件中
- 关注!关注!!!
- 我将ws2_32.dll的WSARecv函数Hook成功后,为什么截获不到http 1.0的数据 (delphi版)
- fsMDIChild窗口"闪"的问题续集
括号里的部分相当于将表中记录依次编号。
(SELECT ROWNUM AS RO ,OP FROM OP) B //这里OP为什么就真不知道了
WHERE A.RO = B.RO + :n AND ROWNUM < 11
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
我也怀疑搞错了
也就是 应该是:
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原句估计写错了
一个分页存储过程 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;
取出满足条件当前当前页的记录就是: 该记录在所有记录的行数=页数*每页的记录数+当前页在该页的行数
所以第一个op是指所有记录,第二个op是从当前记录指针以上的集合中取记录
由此可见oracle很强大啊 短短一句用sql写了那么多 听说sql2005也引进了rownum
不知道用access实现要写多少啊
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
写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
oracle中没见到过啊?
你这个是不是在存储过程里面的?
如果是新插入的记录,好像应该是写成.NEW吧?
:n 是什么写法???
oracle中没见到过啊?
你这个是不是在存储过程里面的?
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字段
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应该是表名.
看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 是具体的行数
想想高中的数列算是白学了:
某页的记录的满足条件:
绝对行数=(页数-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
(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解释下?
没有输入直接确定得到了下面的东西
where a.orm=b.orm+200 and rownum<=100这是按你上面改的!!每页显示100行!!,从200行取数!
也许对你有用,
where a.orm=b.orm+200 and rownum<=100这是按你上面改的!!每页显示100行!!,从200行取数!
也许对你有用,
也就是 应该是:
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 原句估计写错了
老顾客了!照顾一下!
这是DELPHI的用法 在拼凑的 或 事先定义的SQL语句中起到了占位符的作用。