续集 - 我可以在连接中对子查询进行别名吗?

bra*_*ahn 7 ruby sql join subquery sequel

使用Sequel我想将两个子查询连接在一起,共享一些列名,然后在select中对这些列进行表限定.

如果两个数据集只是表格,我理解如何做到这一点.例如,如果我有一个users表和一个items表,包含属于用户的项目,我想列出项目的名称及其所有者的名称:

@db[:items].join(:users, :id => :user_id).
  select{[items__name, users__name.as(user_name)]}
Run Code Online (Sandbox Code Playgroud)

产生

SELECT "items"."name", "users"."name" AS "user_name" 
  FROM "items" 
INNER JOIN "users" ON ("users"."id" = "items"."user_id")
Run Code Online (Sandbox Code Playgroud)

如预期的.

不过,我不确定如何做到这一点,如果我参加代表的子查询(叫他们两个任意的数据集my_itemsmy_users)

语法可能会采用这种形式

my_items.join(my_users, :id => :user_id).
  select{[ ... , ... ]}
Run Code Online (Sandbox Code Playgroud)

我将提供合格的列名来访问my_users.namemy_items.name.这样做的合适语法是什么?

的部分解决方案是使用t1__name的第一个参数,因为它似乎是提供给加入该数据集的别名有t1,t2等,但并不能帮助我晋级的项目名称,这是我需要提供的第二个参数.

我认为最理想的解决方案将使我能够为连接中的数据集提供别名,例如,如下所示(当然,由于多种原因,这不起作用)

my_items.as(alias1).join(my_users.as(alias2), :id => :user_id).
  select{[alias1__name, alias2__name ]}
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

谢谢!

更新

我认为from_self让我成为那里的一部分,例如

my_items.from_self(:alias => :alias1).join(my_users, :id => :user_id).
  select{[alias1__name, t1__name]}
Run Code Online (Sandbox Code Playgroud)

似乎做对了.

bra*_*ahn 8

好的,感谢Ronald Holshausen的暗示,得到了它.关键是.from_self在第一个数据集上使用,并:table_alias在连接中提供选项:

my_items.from_self(:alias => :alias1).
  join(my_users, {:id => :user_id}, :table_alias => :alias2).
  select(:alias1__name, :alias2__name)
Run Code Online (Sandbox Code Playgroud)

产生SQL

      SELECT "alias1"."name", "alias2"."name" 
        FROM ( <my_items dataset> ) AS "alias1" 
  INNER JOIN ( <my_users dataset> ) AS "alias2"
          ON ("alias2"."id" = "alias1"."user_id")
Run Code Online (Sandbox Code Playgroud)

请注意,连接哈希(第二个参数join)需要使用显式花括号来区分它与包含的选项哈希:table_alias.