使用Sequel我想将两个共享一些列名的子查询连接在一起,然后在选择中对这些列进行表限定。
如果两个数据集只是表,我了解如何执行此操作。例如,如果我有一个users
表和一个items
表,其中包含属于用户的项目,并且我想列出项目的名称及其所有者的名称:
@db[:items].join(:users, :id => :user_id).
select{[items__name, users__name.as(user_name)]}
生产
SELECT "items"."name", "users"."name" AS "user_name"
FROM "items"
INNER JOIN "users" ON ("users"."id" = "items"."user_id")
如预期的。
但是,如果我要加入两个表示子查询的任意数据集(调用它们my_items
和my_users
) ,我不确定如何执行此操作
语法可能采用以下形式
my_items.join(my_users, :id => :user_id).
select{[ ... , ... ]}
我将提供合格的列名来访问my_users.name
和my_items.name
. 执行此操作的适当语法是什么?
部分解决方案是t1__name
用于第一个参数,因为提供给连接的数据集似乎使用 , 等别名t1
。t2
但这并不能帮助我限定项目名称,我需要提供给第二个参数。
我认为最理想的解决方案将使我能够为连接中的数据集提供别名,例如如下所示(当然,由于多种原因这不起作用)
my_items.as(alias1).join(my_users.as(alias2), :id => :user_id).
select{[alias1__name, alias2__name ]}
有没有办法做到这一点?
谢谢!
更新
我认为from_self
让我在那里的一部分,例如
my_items.from_self(:alias => :alias1).join(my_users, :id => :user_id).
select{[alias1__name, t1__name]}
似乎做正确的事。