Rust Diesel:添加子查询的结果

Rust Diesel:添加子查询的结果,rust,rust-diesel,Rust,Rust Diesel,鉴于下表: accounts ( id INTEGER, opening_balance INTEGER, ) transactions ( debit INTEGER, credit INTEGER, amount INTEGER foreign key debit references accounts (id), foreign key credit references accounts (id) ) 我要执行以下SQL查询: select id,

鉴于下表:

accounts (
  id INTEGER,
  opening_balance INTEGER,
)

transactions (
  debit INTEGER,
  credit INTEGER,
  amount INTEGER

  foreign key debit references accounts (id),
  foreign key credit references accounts (id)
)
我要执行以下SQL查询:

select
  id,
  opening_balance
  + (select sum(amount) from transactions where debit = account_id)
  - (select sum(amount) from transactions where credit = account_id)
from accounts;
我试过这样的方法:

accounts
    .select((
        id,
        opening_balance
            + transactions::table
                .select(sum(transactions::amount))
                .filter(transactions::debit.eq(id))
            - transactions::table
                .select(sum(transactions::amount))
                .filter(transactions::credit.eq(id)),
    ))
虽然这个查询的各个部分工作正常,但我无法编译它

the trait bound 
`diesel::query_builder::SelectStatement<schema::transactions::table, diesel::query_builder::select_clause::SelectClause<aggregate_folding::sum::sum<diesel::sql_types::Integer, schema::transactions::columns::amount>>, diesel::query_builder::distinct_clause::NoDistinctClause, diesel::query_builder::where_clause::WhereClause<diesel::expression::operators::Eq<schema::transactions::columns::debit, schema::fiscal_year_accounts::columns::account_id>>>: diesel::Expression`
is not satisfied
required because of the requirements on the impl of `AsExpression<diesel::sql_types::Integer>` for 
`diesel::query_builder::SelectStatement<schema::transactions::table, diesel::query_builder::select_clause::SelectClause<aggregate_folding::sum::sum<diesel::sql_types::Integer, schema::transactions::columns::amount>>, diesel::query_builder::distinct_clause::NoDistinctClause, diesel::query_builder::where_clause::WhereClause<diesel::expression::operators::Eq<schema::transactions::columns::debit, schema::fiscal_year_accounts::columns::account_id>>>`
trait绑定
`diesel::query\u builder::SelectStatement:diesel::Expression`
不满意
由于对“AsExpression”的impl的要求而需要
`diesel::查询生成器::SelectStatement`

+
-
运算符使用静态值,但如何让它们使用子查询?

首先:始终提供问题的完整最小示例。这包括所有使用过的板条箱的确切版本、使您的代码实际生成此错误消息的所有相关导入、包含所有帮助和通知语句的完整错误消息,以及在柴油机情况下生成的模式文件

回答您的问题:您错过了将查询转换为可用作表达式的子查询所需的两个调用。两个子查询都返回一个
可空的
,因此需要将
期初余额
作为匹配类型

为了完整起见,请参见下面的工作代码

#[宏使用]
外部板条箱柴油机;
使用柴油机::前奏::*;
桌子{
帐目{
id->Integer,
//更改为'BigInt',因为'Integer'的和返回'BigInt'`
期初余额->BigInt,
}
}
桌子{
交易{
id->Integer,
金额->整数,
借方->整数,
积分->整数,
}
}
允许表格在同一查询中出现!(账户、交易);
fn测试(){
使用self::accounts::dsl::*;
使用diesel::dsl::sum;
让_q=accounts.select((
身份证件
打开_balance.nullable()//在此处调用`.nullable()`将其显式标记为潜在的可空
+事务::表
.选择(金额(交易记录::金额))
.filter(事务处理::debit.eq(id))
.single\u value()//在此处调用`.single\u value()`将此查询转换为子查询
-事务::表
.选择(金额(交易记录::金额))
.filter(事务::credit.eq(id))
.single\u value(),//在此处调用`.single\u value()`将此查询转换为子查询
));
}

Hi weiznich,没错,我想我已经包括了MCVE缺失的所有相关信息。。。谢谢你以任何一种方式度过难关!我不知道
single_value()
,这是缺少的位。