我正在尝试将 Postgres 查询移植到 Rust 中的sea-query
。由于我是 sea-query
的新手,所以我不知道如何移植以下 SQL 代码:
WITH agg_data AS
(SELECT tableB_fk
, tableB.name
, MAX(version) maxversion
, SUM(downloads) sumdownloads
FROM table1
INNER JOIN tableB on tableB.id = tableA.tableB_fk
GROUP BY tableB.name, tableB_fk)
SELECT ad.*
, t2.created
, t2.downloads
FROM agg_data ad
JOIN tableA t2 ON t2.version = ad.maxversion AND t2.tableB_fk = ad.tableB_fk;
我无法弄清楚如何在 sea-query
中使用 with
和 sub-select
进行查询。不幸的是,文档中没有 with
子句的示例。
欢迎任何帮助!
最佳答案
以下代码可以运行并生成与上面相同的字符串。
let base_query = sea_orm::sea_query::SelectStatement::new()
.column(tableB_fk)
.expr(Expr::tbl(tableB, tableB.name))
.expr_as(
Expr::tbl(
tableA,
tableA.Version,
)
.max(),
Alias::new("maxversion"),
)
.expr_as(
Expr::tbl(
tableA,
tableA.Downloads,
)
.sum()
.cast_as(Alias::new("bigint")),
Alias::new("sumdownloads"),
)
.from(tableA)
.inner_join(
tableB,
Expr::tbl(tableB, tableB.Id).equals(
tableA,
tableB_fk,
),
)
.add_group_by(vec![
Expr::col((tableB, tableB.name)).into(),
Expr::col(tableB_fk).into(),
])
.to_owned();
let common_table_expression = CommonTableExpression::new()
.query(base_query)
.table_name(Alias::new("agg_data"))
.to_owned();
let select = sea_orm::sea_query::SelectStatement::new()
.expr(Expr::expr(SimpleExpr::Custom("ad.*".to_string())))
.column((Alias::new("t2"), tableA.Created))
.column((Alias::new("t2"), tableA.Downloads))
.from_as(Alias::new("agg_data"), Alias::new("ad"))
.join_as(
JoinType::Join,
tableA,
Alias::new("t2"),
Condition::all()
.add(
Expr::tbl(Alias::new("t2"), tableA.Version)
.equals(Alias::new("ad"), Alias::new("maxversion")),
)
.add(
Expr::tbl(Alias::new("t2"), tableB_fk)
.equals(Alias::new("t2"), tableB_fk),
),
)
.to_owned();
let with_clause = WithClause::new().cte(common_table_expression).to_owned();
let query = select.with(with_clause).to_owned();
let qs = query.to_string(PostgresQueryBuilder);
println!("QUERY STRING: {qs}");
关于postgresql - 将 Postgresql 移植到 sea-query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73224004/