gpt4 book ai didi

sql - 续集——我可以在连接中为子查询设置别名吗?

转载 作者:数据小太阳 更新时间:2023-10-29 06:58:31 25 4
gpt4 key购买 nike

使用 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_itemsmy_users),我不确定如何执行此操作

语法可能采用以下形式

my_items.join(my_users, :id => :user_id).
select{[ ... , ... ]}

我将在其中提供限定的列名称以访问 my_users.namemy_items.name。执行此操作的适当语法是什么?

部分解决方案是使用 t1__name 作为第一个参数,因为似乎提供给连接的数据集的别名是 t1t2 等。但这并不能帮助我限定项目名称,我需要将其提供给第二个参数。

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

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]}

似乎在做正确的事。

最佳答案

好的,感谢 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)

生成 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")

请注意,连接散列(join 的第二个参数)需要显式花括号以区别于包含 :table_alias 的选项散列。

关于sql - 续集——我可以在连接中为子查询设置别名吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14115325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com