postgresql - 将 Postgresql 移植到 sea-query

标签 postgresql sea-orm sea-query

我正在尝试将 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 中使用 withsub-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/

相关文章:

mysql - 哪个数据库对复制的支持最好

django - 当数据库(PostgreSQL)分区时,如何从Django(版本1.5)管理添加记录?

php - postgres select for update 查询意义

hibernate - 无法在 postgresql hibernate 中使用名为 "user"的表

Rust 异步循环函数阻止另一个 future 执行

sql - SeaORM 外键约束中引用的列 "owner_id"不存在