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