当我使用偏移量和限制时,PostgreSQL 会更改结果
PostgreSQL changes result when i play with offset, limit
大家好,我正在使用以下查询
如果我将限制更改为 10 或 20,结果就会不同
我正在学习 postgresql 我无法弄清楚问题是什么
是否有 postgresql 特定警告?
WITH RECURSIVE children AS (
SELECT id, name, 1 AS depth
FROM wapi_categories
WHERE parentid = 1 AND visible = true
UNION ALL
SELECT a.id, a.name, depth+1
FROM wapi_categories a
JOIN children b ON(a.parentid = b.id)
WHERE a.visible = true
) SELECT wapi_issues.* FROM (SELECT DISTINCT ON(wapi_issues.publicationid) wapi_issues.* FROM wapi_publications
RIGHT JOIN wapi_category_publication ON wapi_category_publication.publication_id = wapi_publications.id RIGHT JOIN (
SELECT *,
max(wapi_issues.issue_identifier) OVER (PARTITION BY wapi_issues.publicationid) max_id FROM wapi_issues WHERE wapi_issues.status = true ORDER BY wapi_issues.issue_identifier DESC
) AS wapi_issues ON wapi_issues.publicationid = wapi_category_publication.publication_id
AND wapi_issues.issue_identifier = max_id
RIGHT JOIN wapi_issue_files ON wapi_issue_files.issueid = wapi_issues.id WHERE wapi_publications.status = true AND (wapi_category_publication.category_id IN (
SELECT id FROM children
) OR wapi_category_publication.category_id = 1) AND wapi_issue_files.pdf = true) AS wapi_issues ORDER BY wapi_issues.issue_identifier DESC
OFFSET 0 LIMIT 20
wapi_categories
------------------
id, name, parentid
------------------
1, "Root", 0
2, "Child 1", 1
3, "Child 2", 1
wapi_publication
------------------
id, name, status
------------------
1, "Publication 1", true
2, "Publication 2", true
wapi_categories_publication
------------------
id, category_id, publication_id
------------------
1, 2, 1
1, 3, 2
wapi_issues
------------------
id, publicationid, title, issue_identifier, status
------------------
1, 1, "Issue 1", 1, true
2, 1, "Issue 2", 3, true
3, 2, "Issue 3", 1, true
4, 2, "Issue 4", 2, true
wapi_issue_files
------------------
id, issueid, file, status
------------------
1, 1, "file1", true
2, 1, "file2", true
3, 2, "file3", true
4, 2, "file4", true
预期结果
只是我想区分 wapi_publications 和他们的最后一期按 wapi_issues.issue_identifier
排序
id, publicationid, title, issue_identifier, status
------------------
3, 1, "Issue 2", 3, true
4, 2, "Issue 4", 2, true
我说结果不同是什么意思
当限制为10时;
id, title
1, "A"
2, "B"
3, "C"
4, "D"
5, "E"
.
.
.
当限制为20时;
id, title
2, "B"
4, "D"
1, "A"
5, "E"
3, "C"
.
.
.
也许您有多个 wapi_issues.issue_identifier,这会阻止您的排序子句创建确定性输出
我最终用这个
改变了子句的顺序
ORDER BY wapi_issues.id ASC, wapi_issues.issue_identifier DESC
据我所知,postgresql 需要显式排序
大家好,我正在使用以下查询
如果我将限制更改为 10 或 20,结果就会不同
我正在学习 postgresql 我无法弄清楚问题是什么
是否有 postgresql 特定警告?
WITH RECURSIVE children AS (
SELECT id, name, 1 AS depth
FROM wapi_categories
WHERE parentid = 1 AND visible = true
UNION ALL
SELECT a.id, a.name, depth+1
FROM wapi_categories a
JOIN children b ON(a.parentid = b.id)
WHERE a.visible = true
) SELECT wapi_issues.* FROM (SELECT DISTINCT ON(wapi_issues.publicationid) wapi_issues.* FROM wapi_publications
RIGHT JOIN wapi_category_publication ON wapi_category_publication.publication_id = wapi_publications.id RIGHT JOIN (
SELECT *,
max(wapi_issues.issue_identifier) OVER (PARTITION BY wapi_issues.publicationid) max_id FROM wapi_issues WHERE wapi_issues.status = true ORDER BY wapi_issues.issue_identifier DESC
) AS wapi_issues ON wapi_issues.publicationid = wapi_category_publication.publication_id
AND wapi_issues.issue_identifier = max_id
RIGHT JOIN wapi_issue_files ON wapi_issue_files.issueid = wapi_issues.id WHERE wapi_publications.status = true AND (wapi_category_publication.category_id IN (
SELECT id FROM children
) OR wapi_category_publication.category_id = 1) AND wapi_issue_files.pdf = true) AS wapi_issues ORDER BY wapi_issues.issue_identifier DESC
OFFSET 0 LIMIT 20
wapi_categories
------------------
id, name, parentid
------------------
1, "Root", 0
2, "Child 1", 1
3, "Child 2", 1
wapi_publication
------------------
id, name, status
------------------
1, "Publication 1", true
2, "Publication 2", true
wapi_categories_publication
------------------
id, category_id, publication_id
------------------
1, 2, 1
1, 3, 2
wapi_issues
------------------
id, publicationid, title, issue_identifier, status
------------------
1, 1, "Issue 1", 1, true
2, 1, "Issue 2", 3, true
3, 2, "Issue 3", 1, true
4, 2, "Issue 4", 2, true
wapi_issue_files
------------------
id, issueid, file, status
------------------
1, 1, "file1", true
2, 1, "file2", true
3, 2, "file3", true
4, 2, "file4", true
预期结果
只是我想区分 wapi_publications 和他们的最后一期按 wapi_issues.issue_identifier
排序id, publicationid, title, issue_identifier, status
------------------
3, 1, "Issue 2", 3, true
4, 2, "Issue 4", 2, true
我说结果不同是什么意思
当限制为10时;
id, title
1, "A"
2, "B"
3, "C"
4, "D"
5, "E"
.
.
.
当限制为20时;
id, title
2, "B"
4, "D"
1, "A"
5, "E"
3, "C"
.
.
.
也许您有多个 wapi_issues.issue_identifier,这会阻止您的排序子句创建确定性输出
我最终用这个
改变了子句的顺序ORDER BY wapi_issues.id ASC, wapi_issues.issue_identifier DESC
据我所知,postgresql 需要显式排序