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,这使得不明确。