从带有postgres联接的子查询中选择歧义列

时间:2018-09-26 06:12:35

标签: sql postgresql subquery

我有以下查询:

select x.id0 
from (
  select * 
  from sessions 
     inner join clicked_products on sessions.id0 = clicked_products.session_id0 
) x;

由于id0sessions都在clicked_products中,所以出现了预期的错误:

  

列引用“ id0”不明确

但是,过去要解决此问题,我只需要指定一个表即可。在这种情况下,我尝试过:

select sessions.id0 
from (
   select * 
   from sessions 
     inner join clicked_products on sessions.id0 = clicked_products.session_id0 
) x;

但是,这将导致以下错误:

  

缺少表“会话”的FROM子句条目

如何从上述查询中仅返回id0列?

注意:我意识到我可以通过完全摆脱子查询来简单地解决问题:

select sessions.id0 
from sessions 
  inner join clicked_products on sessions.id0 = clicked_products.session_id0;

但是,我需要进行进一步的聚合,因此也需要保留子查询语法。

3 个答案:

答案 0 :(得分:0)

我认为:

select x.id from (select sessions.id0 id
  from sessions 
  inner join clicked_products 
  on sessions.id0 = clicked_products.session_id0 ) x;

应该工作。

其他选择是使用Common Table Expression,它更具可读性并且更易于测试。 但是仍然需要别名或选择唯一的列名。

通常,用*选择所有内容不是一个好主意-读取所有列会浪费IO。

答案 1 :(得分:0)

唯一的方法是对子查询返回的列使用别名,以使名称不再歧义。

使用表名对列进行限定不起作用,因为此时sessions不可见(只有x可见)。

是的,这种方式您不能使用SELECT *,但是无论如何您都不应该这样做。由于某种原因,您的查询是一个很好的示例:
假设您有一个像您这样的查询,并且该查询有效,然后有人添加了一个与其他表中的列同名的新列。然后,您的查询突然神秘地中断。

避免使用SELECT *。临时查询可以,但不能在代码中使用。

答案 2 :(得分:0)

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 *

,因此必须从表会话中指定其他列。
相关问题