关于Oracle的SQL分页限定查询问题

丶艾洛依 2017-12-05 09:20:03
我打算做一个分页查询 但是这个查询需要有条件限定 条件限定的语句是需要判断别的条件来拼接SQL语句的
这个是我的全部数据的分页查询




SELECT *
FROM (SELECT
GL.THE_REPAIR_REASON,
GL.CAUSE_OF_THE_PROBLEM,
GL.PROCESSING_RESULTS,
GL.REMARK_OF_RESULT,
GL.USER_ID,
TO_CHAR(GL.CREATE_DATE,'YYYY-MM-DD HH24:MI:SS'),
GL.GL_ID,
U.USERNAME,
ROWNUM RN
FROM LPB_DG_HNGL GL, LPB_USERS U
WHERE GL.USER_ID = U.USER_ID)
WHERE (RN BETWEEN :PAGENUM AND :PAGELENGTH)
...全文
213 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
丶艾洛依 2017-12-06
  • 打赏
  • 举报
回复
这个问题我解决了 原来是我自己写的语句不够严谨 限定条件应该加在子查询里 而不是父查询 比如我要是想USERID = 1 SELECT * FROM (SELECT W.CODE; W.PASSWORD U.USERNAME, U.USERID ROWNUM RN FROM WORK W , USER U WHERE W.USER_ID = U.USER_ID) A WHERE (RN BETWEEN 1 AND 2) A.USERID = '1' 上面的查询是我之前的思路 这样不够严谨 而且有局限性 应该把条件写在子查询里 如下例 SELECT * FROM (SELECT W.CODE; W.PASSWORD U.USERNAME, U.USERID ROWNUM RN FROM WORK W , USER U WHERE W.USER_ID = U.USER_ID AND W.USERID = 1) WHERE (RN BETWEEN 1 AND 2) 这样限定条件就可以直接调用子查询里的表以及数据了
丶艾洛依 2017-12-06
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
不管你写的第一个,还是第三个 sql,前提都是你知道查询字段模式之后才写的。你如果在第二个 sql 中不知道自己写了什么字段,那么在第三个也不应该知道;反之在第三个 sql 中知道,那么在第二个 sql 语句中你也应该知道查询出来有什么字段,绝不可能眼盲啊?!!
我要做一个两表关联的分页查询 分页查询后面需要衔接一些限定条件 比如第一个USER表中字段有USERID;USERNAME 第二个WORK表字段有 USERID;CODE;PASSWORD SELECT * FROM (SELECT W.CODE; W.PASSWORD U.USERNAME, U.USERID ROWNUM RN FROM WORK W , USER U WHERE W.USER_ID = U.USER_ID) 【A】 WHERE (RN BETWEEN 1 AND 2) 这样的就是没有限定条件的分页查询 然后我在后面加限定条件时 比如要求USERID是1 然后我就写了AND USER.USERID=1 结果说是标识符无效 提示错误点在USER.USERID 就是不让表名.列名这样使用 然后我就把子查询 添加了个别名 比如说A 然后写了A.USERID = 1 结果就可以了 但是这样做的条件是 子查询里的数据必须包含USERID 如果以后子查询不包含USERID 那这个不就不生效了吗 那样的话 这个语句又应该怎么写呢
  • 打赏
  • 举报
回复
不管你写的第一个,还是第三个 sql,前提都是你知道查询字段模式之后才写的。你如果在第二个 sql 中不知道自己写了什么字段,那么在第三个也不应该知道;反之在第三个 sql 中知道,那么在第二个 sql 语句中你也应该知道查询出来有什么字段,绝不可能眼盲啊?!!
  • 打赏
  • 举报
回复
引用 1 楼 qq_41074159 的回复:
但是现在这样虽然可行,如果以后子查询的列名不包含限定条件所需要的列名,那岂不是完蛋了。。。
没看懂这个是什么意思。
丶艾洛依 2017-12-05
  • 打赏
  • 举报
回复
我不知道是哪里出了问题 希望能有大神教我一下
丶艾洛依 2017-12-05
  • 打赏
  • 举报
回复
然后我拼接语句时 我是这样拼接的 sql += " AND LPB_DG_HNGL.THE_REPAIR_REASON = '" + the_repair_reason + "'"; 然后会提示我标识符无效 "LPB_DG_HNGL"."THE_REPAIR_REASON" 我把LPB_DG_HNGL换成了GL的表别名 依然提示标识符无效 "GL"."THE_REPAIR_REASON" 这里说一下 我非常确定我没有写错表名和列名,也检查过了好几遍 所以不要跟我说是表名列名错了 我换了这个语句然后就能查询到了数据 SELECT * FROM (SELECT GL.THE_REPAIR_REASON, GL.CAUSE_OF_THE_PROBLEM, GL.PROCESSING_RESULTS, GL.REMARK_OF_RESULT, GL.USER_ID, TO_CHAR(GL.CREATE_DATE,'YYYY-MM-DD HH24:MI:SS'), GL.GL_ID, U.USERNAME, ROWNUM RN FROM LPB_DG_HNGL GL, LPB_USERS U WHERE GL.USER_ID = U.USER_ID) HNGL WHERE (RN BETWEEN :PAGENUM AND :PAGELENGTH) AND HNGL.THE_REPAIR_REASON = ‘1’; 这个语句是把子查询的数据设置表别名调用里面的列名来做的限定,但是现在这样虽然可行,如果以后子查询的列名不包含限定条件所需要的列名,那岂不是完蛋了。。。 然后我也改成过这样 SELECT * FROM (SELECT GL.THE_REPAIR_REASON, GL.CAUSE_OF_THE_PROBLEM, GL.PROCESSING_RESULTS, GL.REMARK_OF_RESULT, GL.USER_ID, TO_CHAR(GL.CREATE_DATE,'YYYY-MM-DD HH24:MI:SS'), GL.GL_ID, U.USERNAME, ROWNUM RN FROM LPB_DG_HNGL GL, LPB_USERS U WHERE GL.USER_ID = U.USER_ID) HNGL,LPB_DG_HNGL WHERE (RN BETWEEN :PAGENUM AND :PAGELENGTH) AND LPB_DG_HNGL.USER_ID = HNGL.USER_ID AND HNGL.THE_REPAIR_REASON = ‘1’; 这样在外层再套一个,用ID重新关联一次, 就可以像最开始那样直接使用限定条件了,但是这样查出来的数据是双份,我现在有点一头雾水

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧