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()
,这是缺少的位。