db2 union all后的分页问题

我有下面一条union all 语句:
SELECT * FROM (SELECT  ef.id,ef.nodeId,ec.name,ef.contentId,ef.publishUrl, ec.date ,ROWNUMBER()  OVER(order by ef.id desc) AS RN1 FROM ecms_content_info ef,ecms_content_items ec where ef.nodeId in(select nodeid from ecms_nodes where tableid = 184) and ef.contentId=ec.contentId and ef.Status='0' and( ec.name like '%机械%') UNION ALL select ef.id,ef.nodeId,ec.name,ef.contentId,ef.publishUrl, ec.date,ROWNUMBER()  OVER(order by ef.id desc) AS RN1 from ecms_content_info ef,ecms_content_person ec where ef.nodeId in(select nodeid from ecms_nodes where tableid = 186) and ef.contentId=ec.contentId and ef.Status='0' and( ec.name like '%机械%') UNION ALL select ef.id,ef.nodeId,ec.name,ef.contentId,ef.publishUrl, ec.date,ROWNUMBER()  OVER(order by ef.id desc) AS RN1 from ecms_content_info ef,ECMS_CONTENT_ENTERPRISE ec where ef.nodeId in(select nodeid from ecms_nodes where tableid = 185) and ef.contentId=ec.contentId and ef.Status='0' and( ec.name like '%机械%')) AS A1 WHERE A1.RN1 BETWEEN 1 AND 20

能搜索出结果,但奇怪的是我明明是限定了显示20条,结果记录却显示40条, 是不是我哪里写的不对呀? 请指教!!!急急急
参与13

12同行回答

tramstrams数据库管理员交通银行信用卡中心
好像这个问题在群里解决了。显示全部
好像这个问题在群里解决了。收起
银行 · 2012-12-21
浏览1113
jlandzpajlandzpa系统运维工程师广州华南资讯科技有限公司
此贴可以结了。显示全部
此贴可以结了。收起
系统集成 · 2012-12-21
浏览1095
huangxinhuangxin其它河南拓普计算机网络工程有限公司
嗯,因为你写3次ROWNUMBER()  OVER(order by ef.id desc) AS RN1 ,每一次RN1 都是从1开始,你的条件是RN1 BETWEEN 1 AND 20,你取3次,所以结果不对。显示全部
嗯,因为你写3次ROWNUMBER()  OVER(order by ef.id desc) AS RN1 ,每一次RN1 都是从1开始,你的条件是RN1 BETWEEN 1 AND 20,你取3次,所以结果不对。收起
IT分销/经销 · 2012-12-19
浏览1175
tianyahechu1124tianyahechu1124数据库管理员duli
是不是条件的问题显示全部
是不是条件的问题收起
IT分销/经销 · 2012-12-19
浏览1171
huangxinhuangxin其它河南拓普计算机网络工程有限公司
改过来啦,试试select * from (SELECT A1.* ,ROWNUMBER()  OVER(order by A1.id desc) AS RN1 FROM (SELECT  ef.id,ef.nodeId,ec.name,ef.contentId,ef.publishUrl, ec.date FROM ecms_content_info ef,ecms_content_items ec where ef.nodeId in(sel...显示全部
改过来啦,试试

select * from (SELECT A1.* ,ROWNUMBER()  OVER(order by A1.id desc) AS RN1 FROM (SELECT  ef.id,ef.nodeId,ec.name,ef.contentId,ef.publishUrl, ec.date FROM ecms_content_info ef,ecms_content_items ec where ef.nodeId in
(select nodeid from ecms_nodes where tableid = 184) and ef.contentId=ec.contentId and ef.Status='0' and( ec.name like '%机械%')
UNION ALL select ef.id,ef.nodeId,ec.name,ef.contentId,ef.publishUrl
from ecms_content_info ef,ecms_content_person ec where ef.nodeId in(select nodeid from ecms_nodes where tableid = 186)
and ef.contentId=ec.contentId and ef.Status='0' and( ec.name like '%机械%')
UNION ALL select ef.id,ef.nodeId,ec.name,ef.contentId,ef.publishUrl, ec.date
AS RN1 from ecms_content_info ef,ECMS_CONTENT_ENTERPRISE ec where ef.nodeId in(select nodeid from ecms_nodes where tableid = 185)
and ef.contentId=ec.contentId and ef.Status='0' and( ec.name like '%机械%')) AS A1) A2 WHERE A2.RN1 BETWEEN 1 AND 20收起
IT分销/经销 · 2012-12-18
浏览1182
wangyaxwangyax软件开发工程师金融机构
SELECT *  FROM (SELECT ef.id,               ef.nodeId,               ec.name,              &nbs...显示全部
SELECT *
  FROM (SELECT ef.id,
               ef.nodeId,
               ec.name,
               ef.contentId,
               ef.publishUrl,
               ec.date,
               ROWNUMBER () OVER (ORDER BY ef.id DESC) AS RN1
          FROM ecms_content_info ef, ecms_content_items ec
         WHERE     ef.nodeId IN (SELECT nodeid
                                   FROM ecms_nodes
                                  WHERE tableid = 184)
               AND ef.contentId = ec.contentId
               AND ef.Status = '0'
               AND (ec.name LIKE '%机械%')
        UNION ALL
        SELECT ef.id,
               ef.nodeId,
               ec.name,
               ef.contentId,
               ef.publishUrl,
               ec.date,
               ROWNUMBER () OVER (ORDER BY ef.id DESC) AS RN1
          FROM ecms_content_info ef, ecms_content_person ec
         WHERE     ef.nodeId IN (SELECT nodeid
                                   FROM ecms_nodes
                                  WHERE tableid = 186)
               AND ef.contentId = ec.contentId
               AND ef.Status = '0'
               AND (ec.name LIKE '%机械%')
        UNION ALL
        SELECT ef.id,
               ef.nodeId,
               ec.name,
               ef.contentId,
               ef.publishUrl,
               ec.date,
               ROWNUMBER () OVER (ORDER BY ef.id DESC) AS RN1
          FROM ecms_content_info ef, ECMS_CONTENT_ENTERPRISE ec
         WHERE     ef.nodeId IN (SELECT nodeid
                                   FROM ecms_nodes
                                  WHERE tableid = 185)
               AND ef.contentId = ec.contentId
               AND ef.Status = '0'
               AND (ec.name LIKE '%机械%')) AS A1
WHERE A1.RN1 BETWEEN 1 AND 20

你限定的是每个Union子集取20条

你要随机取20条的话
直接通过fetch first 20 rows only不行么?收起
互联网服务 · 2012-12-18
浏览1182
jlandzpajlandzpa系统运维工程师广州华南资讯科技有限公司
之前的回复,没有仔细审题显示全部
之前的回复,没有仔细审题收起
系统集成 · 2012-12-17
浏览1239
jlandzpajlandzpa系统运维工程师广州华南资讯科技有限公司
原因就是你两个结果集的RN1都是从1开始的,重复了。显示全部
原因就是你两个结果集的RN1都是从1开始的,重复了。收起
系统集成 · 2012-12-17
浏览1164
改成 union 后 也是一样, 我只想一页显示20条, 但现在结果出来40条,导致页数肯定对不上了。晕了,谁碰到类似问题啊?显示全部
改成 union 后 也是一样, 我只想一页显示20条, 但现在结果出来40条,导致页数肯定对不上了。晕了,谁碰到类似问题啊?收起
2012-12-17
浏览1153
jlandzpajlandzpa系统运维工程师广州华南资讯科技有限公司
union all将保留重复的结果集。显示全部
union all将保留重复的结果集。收起
系统集成 · 2012-12-17
浏览1183

提问者

问题状态

  • 发布时间:2012-12-17
  • 关注会员:1 人
  • 问题浏览:4669
  • 最近回答:2012-12-21
  • X社区推广