sql - 如何在Rails中组合内连接和左外连接

标签 sql ruby-on-rails postgresql

我有两个模型发票付款。它们之间的关系是invoice has_many payments

我使用以下左外连接返回所有尚未支付的发票:

result1 = Invoice.includes(:payments).where(:payments => { :id => nil })

我还对所有已部分支付的发票感兴趣。为了返回它们,我使用内部联接:

result2 = Invoice.joins(:payments).group("transfers.id").having("sum(payments.amount) < invoice.amount")

我现在想合并这两个结果,即我想要所有尚未支付或未全额支付的发票。我知道我可以这样做 result = result1 + result2。但是,这不会返回 ActiveRecord 对象。有没有办法将这两个查询合并到一个查询中?

我使用 Rails 4.1 和 PostgreSQL

最佳答案

我相信你是正确的,如果你不自己编写它,你就无法让 ActiveRecord 生成除内部联接之外的任何内容。但我不会在这种情况下使用 includes ,因为虽然它确实会导致 ActiveRecord 生成不同的联接,但这是一个“实现细节”——它的根本目的是加载 关联的模型,这不一定是您想要的。

在您提出的解决方案中,我不明白为什么您要按 invoices.id payment.id 进行分组 - 这似乎违背了分组。

你可以做类似下面的事情,尽管我不能说这看起来更像 Rails 风格。

Invoice.joins("LEFT JOIN payments ON payments.transfer_id = invoices.id")
  .select("invoices.id, SUM(payments.amount) AS total_paid")
  .group("invoices.id")
  .having("SUM(payments.amount) IS NULL OR SUM(payments.amount) < invoices.amount")

这将返回仅包含 id 字段和 total_paid 字段集的 Invoice 对象列表。如果您需要其他可用字段,请将它们添加到 select 语句和 group 语句中。

关于sql - 如何在Rails中组合内连接和左外连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27029515/

相关文章:

sql - 使用 SQL 2008 EXPRESS/Visual Web Developer 2008 创建 .MDF

ruby-on-rails - rails : Opposite of Hash#to_param

postgresql - 为什么 postgres 强制 sslmode=verify-full 虽然它不在连接字符串中

java - 在 Elastic Search 中对聚合字段(例如平均分数)执行范围过滤器

sql - Postgresql 独特语句

jquery - SQL Server 中的 JSON 数据处理

MySQL 查询 2 个表并从 2 列创建新列

mysql - 如何在现有表的特定位置插入列?

ruby-on-rails - 将 Rails 模型转换为 SQL 插入查询?

ruby-on-rails - delayed_job 进程静默退出