Sequel 在另一个 table 上使用连接和条件进行查询

Sequel query with join and condition on the other table

我是 Sequel 的新手,我正在绞尽脑汁想弄清楚如何让 Sequel 的 API 生成以下琐碎的 SQL:

          select f.* from first f
          join second s on f.second_id = s.id
          where s.deactivated = false

我能想到的最好的是:

      First.join(:second, deactivated: false, id: :second_id)
        .paged_each do |first|
          # magic happens here
        end

但这 select * 而不是 select first.*,因此对 id 用于分页的顺序感到困惑并抛出 PG::AmbiguousColumn: ERROR: ORDER BY "id" is ambiguous

这是使用 Sequel 5.9.0 和 Postres 10。

解决方案

感谢@engineersmnky 关于 qualify 的建议以及进一步阅读这里是我最终使用的方法。

      First.join(:second, id: :second_id, deactivated: false)
        .qualify
        .stream.each do |first|
          # magic happens here
        end

qualify 方法调用解决了歧义(并确保只返回第一个 table。

我还添加了 sequel_pg gem 所以我可以使用 stream.each 而不是 paged_each。这具有更好的性能,但也消除了对 order by id 的需求,这最初让我感到悲伤。

免责声明:我从未实际使用过sequel

似乎有一种方法 Sequel::Dataset#qualify 可以完全满足您的要求,结果应该是:

select first.* from first 
  join second on first.second_id = second.id
  where second.deactivated = false

我认为实现应该是这样的:

First.join(:second, id: :second_id)
    .where(Sequel[:second][:deactivated] => false) 
    #OR .where("second.deactivated": false)
    #OR .where{[[second[:deactivated],false]]}
    .qualify
    .paged_each do |first|
      # magic happens here
    end

现在,如果 FirstSecond 正确关联 Sequel::Model,则连接条件似乎可以通过 association_join See Here from the docs 推断出来,例如

First.association_join(:second)
    .where(Sequel[:second][:deactivated] => false)
    .qualify
    .paged_each do |first|
      # magic happens here
    end