多条件查询 分组 分页的sql语句

本文介绍了一种通过创建临时表实现多条件查询、分组和分页的SQL语句方法。首先,根据特定条件从原始表中选择数据并存入临时表;然后,利用临时表进行分页查询,展示前15条记录,同时排除已显示的前30条记录。

目前只发现一种

实现方法是 先更具条件 ,分组查询出所有数据 存放到临时表中,

然再从临时表中 读书具体 sql语句如下:

 

读出数据插入临时表:

CREATE TABLE #T (

T_ID INT IDENTITY(1,1) PRIMARY KEY,

 WPROJ_ID INTEGER,

PROJ_NAME NVARCHAR(255),

WRES_ID INTEGER,

RES_NAME NVARCHAR(255),

WASSN_ID INTEGER,

TASK_NAME NVARCHAR(255),

ASSN_ACT_WORK_VAR DECIMAL,

ASSN_BEFORE_ACT_WORK DECIMAL,

ASSN_ACT_WORK DECIMAL,

ASSN_WORK DECIMAL,

TASK_UID_SUMMARY INTEGER )

INSERT INTO #T SELECT

 WPROJ_ID,PROJ_NAME,WRES_ID,RES_NAME,WASSN_ID ,TASK_NAME,
 SUM(ASSN_WORK_VAR)/60000 AS'ASSN_ACT_WORK_VAR' ,
 MIN(ASSN_ACT_BEFORE_WORK)/60000 AS'ASSN_BEFORE_ACT_WORK' ,
 MAX(ASSN_ACT_WORK)/60000 AS'ASSN_ACT_WORK',

 MAX(ASSN_WORK)/60000AS'ASSN_WORK',
 TASK_UID_SUMMARY

 FROM

 MSP_TRANSACTIONS_UPDATE

WHERE

 WTRANS_ACTION IN(1,4)  AND WASSN_DELETED_IN_PROJ=0

 

GROUP BY WPROJ_ID,PROJ_NAME,WRES_ID,RES_NAME,WASSN_ID, TASK_NAME,TASK_UID_SUMMARY

 

 

 

 

从临时表 分页查询:

SELECT TOP 15 WPROJ_ID,PROJ_NAME,WRES_ID,RES_NAME,WASSN_ID ,TASK_NAME,
                           ASSN_ACT_WORK_VAR,ASSN_BEFORE_ACT_WORK ,ASSN_ACT_WORK,ASSN_WORK,TASK_UID_SUMMARY

 

FROM #T

 

WHERE

T_ID  NOT IN( SELECT TOP  30   T_ID FROM #T )

 

 

 

在 MyBatis 中调用 Oracle 进行多表查询并实现分页,可采用嵌套子查询结合 `rownum` 或 `row_number()` 函数的方式。 ### 使用 `row_number()` 函数实现分页 假设存在两个表 `tableA` 和 `tableB`,通过 `GUID` 字段关联进行多表查询,以下是分页查询SQL 示例: ```sql SELECT * FROM ( SELECT t.*, row_number () over ( ORDER BY t.GUID ) AS num FROM ( SELECT tableA.*, tableB.* FROM tableA JOIN tableB ON tableA.GUID = tableB.GUID WHERE tableA.MJ >= 10 ) t ) tt WHERE num BETWEEN 5 AND 6; ``` 此 SQL 先对 `tableA` 和 `tableB` 进行多表查询,接着利用 `row_number()` 函数为结果集添加行号,最后筛选出指定页码范围的记录。 ### 使用 `rownum` 实现分页 同样以 `tableA` 和 `tableB` 表为例,以下是使用 `rownum` 实现分页SQL 示例: ```sql SELECT * FROM ( SELECT t.*, rownum r FROM ( SELECT tableA.*, tableB.* FROM tableA JOIN tableB ON tableA.GUID = tableB.GUID WHERE tableA.MJ >= 10 ) t WHERE rownum < 10 ) WHERE r > 5; ``` 该 SQL 先进行多表查询,然后取前 10 行记录,最后从这 10 行中筛选出第 5 行之后的记录。 在 MyBatis 的映射文件中,可将上述 SQL 语句配置为查询语句,示例如下: ```xml <select id="getMultiTableDataWithPagination" resultMap="MultiTableResultMap"> SELECT * FROM ( SELECT t.*, row_number () over ( ORDER BY t.GUID ) AS num FROM ( SELECT tableA.*, tableB.* FROM tableA JOIN tableB ON tableA.GUID = tableB.GUID WHERE tableA.MJ >= #{minMj} ) t ) tt WHERE num BETWEEN #{start} AND #{end} </select> ``` 在 Java 代码中调用该查询方法时,需传入 `minMj`、`start` 和 `end` 参数。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值