小编Ric*_*ick的帖子

Rails命令结果与多个连接到同一个表

- 编辑 -

我想简化这个问题.有了这个模型结构:

has_one :pickup_job, class_name: 'Job', source: :job
has_one :dropoff_job, class_name: 'Job', source: :job
Run Code Online (Sandbox Code Playgroud)

我想做的是:

Package.joins(:dropoff_job, :pickup_job).order(pickup_job: {name: :desc})
Run Code Online (Sandbox Code Playgroud)

这显然无效,应该使用的实际语法是:

.order('jobs.name desc')
Run Code Online (Sandbox Code Playgroud)

但是rails连接表的方式意味着我无法确保表别名是什么(如果有的话),这将dropoff_job.name取代而不是pickup_job.name

irb(main):005:0> Package.joins(:dropoff_job, :pickup_job).order('jobs.name desc').to_sql
=> "SELECT \"packages\".* FROM \"packages\" INNER JOIN \"jobs\" ON \"jobs\".\"id\" = \"packages\".\"dropoff_job_id\" INNER JOIN \"jobs\" \"pickup_jobs_packages\" ON \"pickup_jobs_packages\".\"id\" = \"packages\".\"pickup_job_id\" ORDER BY jobs.name desc"
Run Code Online (Sandbox Code Playgroud)

此外,我无法控制表的连接方式,因此我无法定义表别名.

--UPDATE--

我尝试使用以下内容从当前作用域中提取别名:

current_scope.join_sources.select { |j| j.left.table_name == 'locations' }
Run Code Online (Sandbox Code Playgroud)

但我仍然有点卡住,真的觉得应该有一个更简单的解决方案.

--UPDATE--

潘的答案适用于某些情况,但我正在寻找一个更有活力的解决方案.

ruby-on-rails arel

9
推荐指数
2
解决办法
1099
查看次数

SQL - 有效地将两个查询连接在一起

我有两个SQL查询查询不同的表并返回类似的字段:

User - Role - Category - Points
Run Code Online (Sandbox Code Playgroud)

User - Role - Category - Target
Run Code Online (Sandbox Code Playgroud)

我的查询看起来像这样:

select
    acs.UserID,
    acs.RoleID,
    acs.CategoryID,
    sum(acs.Points)
from acs
Run Code Online (Sandbox Code Playgroud)

select
    tb.UserID,
    tb.RoleID,
    tb.CategoryID,
    sum(
        (
            (DATEDIFF(dd, (case when @start >= tb.StartDate then @start else tb.StartDate end), (case when @end <= tb.EndDate then @end else tb.EndDate end)) + 1) 
        ) * tb.dailyMed
    ) as Target
from tb
Run Code Online (Sandbox Code Playgroud)

我想最终得到的是这样的:

User - Role - Category - Points - Target
Run Code Online (Sandbox Code Playgroud)

每个单独的查询运行时间不到1秒,但是当我尝试使用内部联接组合它们时,运行需要3分钟.

我希望有一种更有效的方式来做到这一点,但我似乎无法找到一个.

*编辑我的内部联接看起来像这样

select
    acs.UserID,
    acs.RoleID,
    acs.CategoryID,
    sum(acs.Points), …
Run Code Online (Sandbox Code Playgroud)

sql sql-server

0
推荐指数
1
解决办法
2879
查看次数

标签 统计

arel ×1

ruby-on-rails ×1

sql ×1

sql-server ×1