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
现在,如果 First
和 Second
正确关联 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
我是 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
现在,如果 First
和 Second
正确关联 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