如果第一个 SQL 查询返回的行数少于限制,则执行第二个 SQL 查询

问题描述 投票:0回答:1

我有两个这样的 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)`,

如有任何帮助,我们将不胜感激,谢谢!

sql postgresql performance subquery union
1个回答
0
投票

您可以使用的一个技巧是添加一个计算列来跟踪并集的每一半。 然后再次使用该计算列进行子查询和顺序限制来提供排序:

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 条时,才会使用第二个查询中的记录。

© www.soinside.com 2019 - 2024. All rights reserved.