解决子选择中的歧义列

amp*_*ine 3 sql postgresql join subquery left-join

我在使用联接ON表达式语法从子选择中选择一个列时遇到麻烦,该子选择在两个联接表之间具有共享名称。

我有两个表,eventgeography其中的每一个具有一geography_id列,该列是相同的数据类型,并event.geography_id为外键入geography(地理提供关于事件的信息):

Dia的简化ERD

我遇到的问题是,使用ON语法将它们联接在一起时,我无法引用这两个表之间的共享列,但是在使用USING语法时它可以工作。

我意识到这是USING有效的,因为它抑制了多余的列,但是由于该语句使用了许多不同的连接表,这些表的模式发生的变化通常不会改变,所以我宁愿尽可能明确。

我遇到的具体SQL是:

select
    x.event_id
from (
    select * from event e
    left join geography g on (e.geography_id = g.geography_id)
) x
where
    x.geography_id in (1,2,3)
Run Code Online (Sandbox Code Playgroud)

给出错误:

错误:列引用“ geography_id”不明确

第8行:(1,2,3)中的x.geography_id

我正在使用PostgreSQL 9.0.14。

bgo*_*dst 7

这将是SQL中非常有用的功能,它能够选择所有您明确要排除的列之外的所有列。如果存在,则可以使用排除来解决此问题g.geography_id。不幸的是,这种功能似乎在任何DBMS中都不存在。参见https://dba.stackexchange.com/questions/1957/sql-select-all-columns-except-some

正如@a_horse_with_no_name所评论的那样,一种解决方案是列出您要选择的每个列,而只删除不需要的列。

实际上,还有另一种可能更可取的解决方案,即选择*e.geography_id,但也将后者别名为另一个名称,该名称随后将在子查询结果集中是明确的。像这样:

select
    x.event_id
from (
    select *, e.geography_id geography_id1 from event e
    left join geography g on (e.geography_id = g.geography_id)
) x
where
    x.geography_id1 in (1,2,3)
Run Code Online (Sandbox Code Playgroud)