我正在使用oracle从购物应用中输出订单项.每个项目的数量字段可能大于1,如果是,我想将该行返回N次.
这就是我正在谈论的一张桌子
product_id, quanity
1, 3,
2, 5
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个可以返回的查询
1,3
1,3
1,3
2,5
2,5
2,5
2,5
2,5
Run Code Online (Sandbox Code Playgroud)
这可能吗?我看到了SQL Server 2005的这个答案,我正在寻找oracle中几乎所有的东西.遗憾的是,建立专用号码表不是一种选择.
在HSQLDB的changelog,各国ROWNUM()
在加入v2.2.0
其竞选对手在内存中的HSQLDB集成测试时,我使用没有任何问题.
但是我想对真正的Oracle 10g数据库运行相同的测试,但查询失败,因为调用了伪列ROWNUM
.是否有一种简单的方法可以编写在两种环境中都有效的单个查询字符串?
所以我想在Oracle DB中选择一系列行.我需要这样做,因为我在表中有数百万行,我想将结果分页给用户(如果你知道在客户端执行此操作的另一种方法,我使用JavaFX,如果它很重要,但我不认为通过网络发送所有数据以在客户端对它们进行分页是个好主意.
所以看完这篇文章后:SQL ROWNUM如何在特定范围之间返回行,我有以下查询:
Select * From (Select t.*, rownum r from PERSON t) Where r > 100 and r < 110;
Run Code Online (Sandbox Code Playgroud)
该100
和110
只是例子.在应用程序中,我只要求下限并添加10_000的大小以获取下一个10_000行.
现在rownum列出现在结果中,我不想看到它.由于我对SQL不是很熟悉,所以我的问题是:
Select * From Person Where rownum > 100 and rownum < 110;
返回0行?为什么没有简单的方法做某事Select ... FROM ... WHERE rownum BETWEEN lowerBound AND upperBound
?
如何摆脱r
结果值中的列?从那里SQL使用SELECT*[除了columnA] FROM tableA排除一列?我显然需要创建一个视图或临时表,但考虑我的查询还有另一种方法吗?
它确保正确的分页吗?我读了这篇文章 "用ROWNUM分页",它说我应该通过一些独特的东西来命令这些值以获得一致的分页(所以rownum
如果你能确认,我猜测排序很好).它不会破坏使用目的FIRST_ROWS(N)
吗?
我希望它不是太多,我可以分成不同的问题,但我认为让它们紧密相关是有意义的.
谢谢 :)
问题
我试图理解为什么在这两个Oracle语法更新查询中看起来微不足道的原因导致执行计划完全不同.
查询1:
UPDATE sales s
SET status = 'DONE', trandate = sysdate
WHERE EXISTS (Select *
FROM tempTable tmp
WHERE s.key1 = tmp.key1
AND s.key2 = tmp.key2
AND s.key3 = tmp.key3)
Run Code Online (Sandbox Code Playgroud)
查询2:
UPDATE sales s
SET status = 'DONE', trandate = sysdate
WHERE EXISTS (Select rownum
FROM tempTable tmp
WHERE s.key1 = tmp.key1
AND s.key2 = tmp.key2
AND s.key3 = tmp.key3)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,两者之间的唯一区别是查询2中的子查询返回rownum而不是每行的值.
这两者的执行计划不可能更加不同:
Query1 - 从两个表中提取总结果,并使用sort和hashjoin返回结果.这有利于2,346的成本(尽管使用了EXISTS条款和有凝聚力的子查询).
Query2 - 同时拉取两个表结果,但使用计数和过滤器来完成相同的任务,并以惊人的77,789,696成本返回执行计划!我应该注意到他的查询只是挂在我身上所以我实际上并不是肯定的,这会返回相同的结果(尽管我相信它应该).
根据我对Exists子句的理解,它只是一个简单的布尔检查,它运行在主表的每一行.如果在我的EXISTS条件中返回单行或100,000行也没关系...如果为正在运行的行返回任何结果,那么您已经通过了存在检查.那么为什么我的子查询SELECT语句返回的重要性呢?
- - - - - - - - - …
我有这样的作业表
EMPLID | RCD | COMPANY | EFFDT | SALARY
---------------------------------------------------
100 | 0 | xyz | 1/1/2000 | 1000
100 | 0 | xyz | 1/15/2000 | 1100
100 | 0 | xyz | 1/31/2000 | 1200
100 | 0 | ggg | 2/15/2000 | 1500
100 | 1 | abc | 3/1/2000 | 2000
100 | 1 | abc | 4/1/2000 | 2100
Run Code Online (Sandbox Code Playgroud)
我需要一个计数器,当RCD或公司组合发生变化时,该计数器应该增加,并且应该由effdt订购.
EMPLID | RCD | COMPANY | EFFDT | SALARY | COUNTER
-------|-----|---------|---------------|-------------|----------
100 | …
Run Code Online (Sandbox Code Playgroud) 我在 Oracle SQL 中有这样的查询:
select town_name,
regexp_substr(town_name, '[^A,]+', 1, 1) as c1,
regexp_substr(town_name, '[^A,]+', 1, 2) as c2,
regexp_substr(town_name, '[^A,]+', 1, rownum) as c_rownum,
rownum
from epr_towns
Run Code Online (Sandbox Code Playgroud)
结果的前 2 行是:
VALGANNA V LG V 1
VARANO BORGHI V R R 2
Run Code Online (Sandbox Code Playgroud)
我需要在 PostgreSQL 上获得相同的结果(对于带有 的行regexp_substr(town_name, '[^A,]+', 1, rownum) as c_rownum
),但我不知道如何实现。你可以帮帮我吗?谢谢。
我在网上搜索Oracle分页查询,其中大部分都告诉我将查询包装两次:
SELECT *
FROM (SELECT t.*, ROWNUM rn
FROM tableName t
WHERE ROWNUM < 200)
WHERE rn > 100
Run Code Online (Sandbox Code Playgroud)
只是想知道我是否可以输入:
SELECT *, ROWNUM rn
FROM tableName t
WHERE ROWNUN BETWEEN 100 AND 200
Run Code Online (Sandbox Code Playgroud)
似乎第二个也适用.这两个查询之间是否存在(性能)差异?
这是正常的还是我错过了什么?
如果我设置loadonce: true
,我的网格只返回5条记录.
但是,如果我将其更改为loadonce: false
,网格将获得所有记录
我的代码如下.
$("#leave-detail-grid").jqGrid({
url:'grid/grid_leave_detail.php',
datatype: 'xml',
mtype: 'GET',
colNames:['Date','Day','Approver','Leave Type','Status','Purpose | Reason'],
colModel :[
{name:'start_date', index:'start_date', width:80, editable:false, align:"left", editrules:{required:true}},
{name:'day', index:'day', width:80, editable:false, align:"left", editrules:{required:true}},
{name:'sup', index:'sup', width:130, editable:false, align:"left", editrules:{required:true}},
{name:'desc', index:'desc', width:130, editable:false, align:"left", editrules:{required:true}},
{name:'status', index:'status', width:80, editable:false, align:"center", editrules:{required:true}},
{name:'purpose', index:'purpose', width:180, editable:false, align:"left", editrules:{required:true}}
],
height: 'auto',
pager: '#leave-detail-pager',
pgbuttons: true,
pginput: 'Yes',
pgtext: 'Yes',
rowNum:5,
rowList:[20,40,100,200,400],
sortname: 'start_date',
sortorder: 'asc',
loadonce: true, // to enable …
Run Code Online (Sandbox Code Playgroud) 我使用的是Oracle 10g,我有一个加入两个大表(数百万条记录)的视图.我试图为用户选择有限的"样本"数据,如下所示:
select * from VIEW_NAME where ROWNUM < 5;
Run Code Online (Sandbox Code Playgroud)
它非常慢,我认为它不应该是,因为我只需要几行结果,所以Oracle不应该计算完整的连接.
要求是用户应该能够以交互方式指定返回的行数(与结果中的哪些行无关紧要).有没有办法实现这个目标?(使用rownum或其他方法)
(我可以更改视图定义或最终SQL的构建方式,但据我所知,我不能动态地传递有关行的所需数量的视图的信息)
编辑:视图定义非常简单,如下所示:
CREATE OR REPLACE VIEW VIEW_NAME AS
(
select
e.id as ID,
e.somefield as something,
... (some similar selects from e)
c.field as anotherthing,
... (lots of other fields from c)
from SCHEMA.TABLE1 e
inner join SCHEMA.TABLE2 c on e.key = c.key
)
Run Code Online (Sandbox Code Playgroud)
解释计划提到两个表的完整表访问并不奇怪,因为只返回前几行不应该花费很长时间.
EDIT2:这是完整的计划
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 2644394598
----------------------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes …
Run Code Online (Sandbox Code Playgroud) 假设我需要选择 3 到 10 行。对于 MySQL,我将使用limit 对于 ORACLE,我将使用rownum
Impala 是否允许通过如此简单的方法选择确定的行?提前致谢。
rownum ×10
oracle ×8
sql ×4
row-number ×2
database ×1
dense-rank ×1
exists ×1
hsqldb ×1
impala ×1
jqgrid ×1
jquery ×1
limit ×1
pagination ×1
performance ×1
postgresql ×1
repeat ×1
select ×1
view ×1