我有两个这样的 SQL 查询:
postgresql
:
第一个查询是获取从未同步或最近更新并很久以前同步的订阅:
SELECT *
FROM subscriptions
WHERE (last_sync_at IS NULL OR last_sync_at < updated_at) AND updated_at < $1
ORDER BY last_sync_at NULLS FIRST
LIMIT $2`,
第二个查询正在获取订阅,但第一个查询是最长时间前同步的。
SELECT *
FROM subscriptions
ORDER BY last_sync_at NULLS FIRST
LIMIT $1`,
我想像这样聚合这两个查询: 如果第一个查询返回的结果少于限制,那么我想执行第二个查询来填充批次。
例如,如果限制为
100
并且第一个查询返回 90
,我想以限制为 10
执行第二个查询。
我可以使用代码轻松完成此操作,但我想知道是否有一种方法可以通过一个 SQL 查询来完成此操作,并且它是否会更高效?
我尝试过类似的方法,但显然它不起作用:
`(SELECT *, COUNT(*) as nb_rows_selected
FROM subscriptions
WHERE (last_chartmogul_sync_at IS NULL OR last_chartmogul_sync_at < updated_at) AND updated_at < $1
ORDER BY last_chartmogul_sync_at NULLS FIRST
GROUP BY id
LIMIT $2)
UNION
(SELECT *
FROM subscriptions
ORDER BY last_sy NULLS FIRST
LIMIT nb_rows_selected - $2)`,
如有任何帮助,我们将不胜感激,谢谢!
您可以使用的一个技巧是添加一个计算列来跟踪并集的每一半。 然后再次使用该计算列进行子查询和顺序限制来提供排序:
SELECT *
FROM
(
(
SELECT *, 1 AS src
FROM subscriptions
WHERE (last_sync_at IS NULL OR last_sync_at < updated_at) AND
updated_at < $1
ORDER BY last_sync_at NULLS FIRST
LIMIT $2
)
UNION
(
SELECT *, 2
FROM subscriptions
ORDER BY last_sync_at NULLS FIRST
LIMIT $1
)
) t
ORDER BY src
LIMIT 100;
上面将优先从第一个查询中获取记录,以满足 100 条的限制配额。只有当第一个查询返回的记录少于 100 条时,才会使用第二个查询中的记录。