我在Postgres 8.2数据库(Windows)上运行此查询:
SELECT
*
FROM
(SELECT * FROM table1 tb1 WHERE date='2019-03-06' ) tb1
JOIN table2 tb2 ON
tb2.tb1_id = tb1.id
WHERE
tb2.date ='2019-03-06'
然后我收到了此错误消息:
错误:关系的第11729页中的无效页面标头 " table1_pkey" sql状态:xx001
但是,当我添加Order By
子句时,此查询运行良好。
SELECT
*
FROM
(SELECT * FROM table1 tb1 WHERE date='2019-03-06' ORDER BY id) tb1
JOIN table2 tb2 ON
tb2.tb1_id = tb1.id
WHERE
tb2.date = '2019-03-06'
afaik,错误" block xxx中的无效页面标头"主要是因为不良内存或不良驱动器(链接:Postgres数据库错误无效页面标题)。
但是,当我添加Order By
子句时,它如何运行?
我认为您的查询在评估SELECT * FROM table1
实际返回哪些列时很难,因此它不知道tb1.id
是否存在并且是主要键。
当我看到您的查询时,您可以这样做一个简单的加入:
SELECT
*
FROM
table1 tb1
JOIN
table2 tb2 ON tb2.tb1_id = tb1.id
WHERE
tb2.date = '2019-03-06' AND tb1.date = '2019-03-06'
结果应该相同。是的,这可能会给性能带来惩罚,但不应该很重要。