主表:bdg_budget_project
辅表:bdg_budget
关系:一对一关系
问题:相同sql ,分页查询,多次点击,返回的数据可能不同
原因:排序字段是辅表的字段【具体原理暂时没弄明白,大概是因为排序操作的触发时间 和 辅表数据应该会随主表进行变化】
SELECTid,name
FROM(SELECTTMP.*,ROWNUM ROW_IDFROM(SELECTa.id,a.budget_id,a.project_id,a.name,b.bdg_status_type,b.bdg_status_nameFROMbdg_budget_project aLEFT JOIN bdg_budget b ON a.budget_id = b.idWHEREb.budget_at = 2022AND b.deleted_flag = 0ORDER BYb.INSTITUTION_ID_PATH ASC,b.register_at DESC ) TMPWHEREROWNUM <= 40)
WHEREROW_ID > 20
解决:因为排序字段是固定的,只能从bdg_budget表获取字段,所以需要将bdg_budget放到主表的位置,既主表位置与辅表位置调换
SELECTid,name
FROM(SELECTTMP.*,ROWNUM ROW_IDFROM(SELECTa.id,a.budget_id,a.project_id,a.name,b.bdg_status_type,b.bdg_status_nameFROMbdg_budget bLEFT JOIN bdg_budget_project a ONa.budget_id = b.idWHEREb.budget_at = 2022AND b.deleted_flag = 0ORDER BYb.INSTITUTION_ID_PATH ASC,b.register_at DESC ) TMPWHEREROWNUM <= 40)
WHEREROW_ID > 20
注意:
若辅表需要过滤,其实可以考虑将过滤条件添加至 ON 后,进行 AND 操作;可以缩小辅表的数据量,减少关联时的对比次数,但无论辅表是否存在符合要求的数据,最终都会查出主表的数据量;
如果将限制条件放到 WHERE 后,则此时是对关联后的结果集进行筛选,数据量可能会减少;