Sql 从包含postgres连接的子查询中选择不明确的列
我有以下疑问:Sql 从包含postgres连接的子查询中选择不明确的列,sql,postgresql,subquery,Sql,Postgresql,Subquery,我有以下疑问: select x.id0 from ( select * from sessions inner join clicked_products on sessions.id0 = clicked_products.session_id0 ) x; 由于id0在这两个会话中,并在产品中单击,因此我得到了预期的错误: 列引用id0不明确 然而,过去为了解决这个问题,我只需要指定一个表。在这种情况下,我尝试: select sessions.id0 from
select x.id0
from (
select *
from sessions
inner join clicked_products on sessions.id0 = clicked_products.session_id0
) x;
由于id0在这两个会话中,并在产品中单击,因此我得到了预期的错误:
列引用id0不明确
然而,过去为了解决这个问题,我只需要指定一个表。在这种情况下,我尝试:
select sessions.id0
from (
select *
from sessions
inner join clicked_products on sessions.id0 = clicked_products.session_id0
) x;
但是,这会导致以下错误:
表会话的子句条目中缺少
如何仅从上述查询返回id0列
注意:我意识到我可以通过一起去掉子查询来解决这个问题:
select sessions.id0
from sessions
inner join clicked_products on sessions.id0 = clicked_products.session_id0;
但是,我需要进行进一步的聚合,因此需要保留子查询语法 我假设:
select x.id from (select sessions.id0 id
from sessions
inner join clicked_products
on sessions.id0 = clicked_products.session_id0 ) x;
应该有用
另一种选择是使用可读性更强、更易于测试的方法。
但仍需要别名或选择唯一的列名
一般来说,使用*选择所有内容都不是一个好主意-读取所有列是浪费IO。唯一的方法是为子查询返回的列使用别名,这样名称就不再模棱两可 使用表名限定列不起作用,因为此时会话不可见,只有x是可见的 是的,这样您就不能使用SELECT*,但无论如何也不应该这样做。出于某种原因,您的查询是一个很好的例子: 假设您有一个与您的查询类似的有效查询,然后有人添加了一个与另一个表中的列同名的新列。然后你的疑问突然神秘地中断了 避免选择*。对于特殊查询,这是可以的,但在代码中则不行
select x.id from
(select sessions.id0 as id, clicked_products.* from sessions
inner join
clicked_products on
sessions.id0 = clicked_products.session_id0 ) x;
但是,您必须从表会话中指定其他列,因为您不能使用SELECT*您可以在子查询中为列指定别名,在子查询外部使用别名。在派生表中不要使用SELECT*。选择您需要的列,因为您使用*,指定您的列,因为在结果子查询中,您有2个id0,这使得不明确。