我有以下查询:
select x.id0
from (
select *
from sessions
inner join clicked_products on sessions.id0 = clicked_products.session_id0
) x;
由于id0
和sessions
都在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;
但是,我需要进行进一步的聚合,因此也需要保留子查询语法。
答案 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 *
,因此必须从表会话中指定其他列。