我的 Postgres DB 中有一个表 (t0),其数据如下所示:
t1_id t2_id
1 1
2 1
2 1
4 null
4 null
5 null
我有一个查询来返回我想要的结果:
t1_id t2_id
1 1
4 null
5 null
我的查询看起来像这样:
(
SELECT DISTINCT ON (t2_id) t1_id, t2_id
FROM t0
WHERE t2_id IS NOT NULL
)
UNION ALL
(
SELECT DISTINCT ON (t1_id) t1_id, t2_id
FROM t0
WHERE t2_id IS NULL
)
有没有更快的方法来做这样的操作?这还不错,但是我在几个地方(通过连接)都在做这件事,所有这些重复的查询似乎让事情变慢了一点。似乎必须有更好的方法。
这是小提琴形式的查询:http ://sqlfiddle.com/#!15/d41d8/3603
对于简单的情况,我只能想到对查询的小改进:
正如ypercube 提到的,您需要添加
ORDER BY
一个明确的表达式列表以获得确定性结果。您可以在查询的第二段中使用常量
NULL
而不是。t2_id
也与以下指数支持有关。性能的关键是索引。尝试匹配查询的两个部分的两个部分索引:
您可能希望也可能不希望包含其他列以允许仅索引扫描。
根据表大小和数据分布,可能会有更快的替代方案:
单身的
SELECT
如果你想把它压缩成一个
SELECT
:等效,但排序顺序除外。如果您希望它更快,请尝试使用功能索引:
举个例子,这会做到:
它本质上是说“在 上做一个不同的
t2_id
,但如果那是null
使用t1_id
而不是”。