将 GROUPBY COUNT(*) 添加到 SQLAlchemy 中的 UNION ALL 查询 - 除了等效项

Add GROUPBY COUNT(*) to UNION ALL Query in SQLAlchemy - EXCEPT Equivalent

我有一个查询,它对 SQLAlchemy 中的两个 SELECT 语句执行 UNION ALL 操作。看起来像这样,

union_query = query1.union_all(query2)

我现在想做的是使用多个属性执行 GROUPBY,然后只获取 COUNT(*) 等于 1 的行。我该怎么做?

我知道我可以像这样进行 GROUPBY,

group_query = union_query.group_by(*columns)

但是,如何添加 COUNT(*) 条件?

因此,最终结果应该与此查询等价,

SELECT * FROM (
<query1>
UNION ALL
<query2>) AS result
GROUP BY <columns>
HAVING COUNT(*) = 1

另外,我也想知道是否可以从结果中只获取某列的不同值。那相当于这个,

SELECT DISTINCT <column> FROM (
<query1>
UNION ALL
<query2>) AS result
GROUP BY <columns>
HAVING COUNT(*) = 1

这些基本上是仅获取两个 SELECT 语句的唯一结果的查询。

注意:最简单的方法是使用 EXCEPT 或 EXCEPT ALL,但我的数据库是 运行 MariaDB 8,因此不支持这些操作。

对于第一个查询,请尝试以下 final_query 是您要 运行 的查询。

union_query = query1.union_all(query2)
group_query = union_query.group_by(*columns)
final_query = group_query.having(func.count() == 1)

对于第二个查询,请尝试以下操作。

union_query = query1.union_all(query2)
group_query = union_query.group_by(*columns)
subquery = group_query.having(func.count() == 1).subquery()
final_query = query(<column>, subquery).distinct()

参考资料