You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求协助将指定SQL转换为Ruby Sequel语法,解决子查询执行顺序问题

没问题!我帮你把这段SQL转换成Ruby Sequel的写法,完全贴合你原有的子查询逻辑,同时也给你补充一些优化建议:

转换后的Ruby Sequel代码(子查询写法)

假设你已经定义了对应的数据模型:SalesLeads 映射 sales_leads 表,Persons 映射 persons 表,Employees 映射 employees 表。

# 初始化主查询,获取去重的employee_person_id
query = SalesLeads.distinct.select(:employee_person_id)

# 添加获取full_name的标量子查询
query = query.select_append(
  Persons.select(:full_name)
         .where(Persons[:id] => SalesLeads[:employee_person_id])
         .as(:full_name)
)

# 添加统计open状态线索数的子查询
query = query.select_append(
  SalesLeads.select(Sequel.function(:count, :id))
            .where(
              SalesLeads[:employee_person_id] => Employees[:person_id],
              status: 'open'
            )
            .as(:open_leads_count)
)

# 如果你还有其他状态的统计需求,直接按相同模式追加即可
# query = query.select_append(
#   SalesLeads.select(Sequel.function(:count, :id))
#             .where(
#               SalesLeads[:employee_person_id] => Employees[:person_id],
#               status: 'your_target_status'
#             )
#             .as(:other_leads_count)
# )

# 执行查询并获取结果集
results = query.all

注意事项与优化建议

  1. 关于employees.person_id的疑问:原SQL里的employees.person_id在主查询中没有关联employees表,大概率是笔误。如果你的需求是统计当前行employee_person_id对应的open线索数,应该把条件改成关联外层的sales_leads表,用correlate方法避免别名冲突:
query = query.select_append(
  SalesLeads.select(Sequel.function(:count, :id))
            .where(
              Sequel[:sales_leads][:employee_person_id] => Sequel[:sales_leads_outer][:employee_person_id],
              status: 'open'
            )
            .correlate(:sales_leads_outer)
            .as(:open_leads_count)
)
  1. 性能优化方案:子查询写法虽然直观,但多次子查询可能影响性能。你可以改用LEFT JOIN + GROUP BY的方式重写逻辑,执行效率通常更高:
# 预统计各员工的open线索数
open_leads_stats = SalesLeads.where(status: 'open').group_and_count(:employee_person_id)

# 主查询关联表获取所需字段
query = SalesLeads.distinct
                  .left_join(Persons, id: :employee_person_id)
                  .left_join(open_leads_stats, employee_person_id: :employee_person_id)
                  .select(
                    :employee_person_id,
                    Persons[:full_name],
                    # 用coalesce处理没有线索的情况,返回0而不是NULL
                    Sequel.coalesce(open_leads_stats[:count], 0).as(:open_leads_count)
                  )

results = query.all

内容的提问来源于stack exchange,提问作者harpocrates

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:45:40