amp*_*ine 3 sql postgresql join subquery left-join
我在使用联接ON表达式语法从子选择中选择一个列时遇到麻烦,该子选择在两个联接表之间具有共享名称。
我有两个表,event和geography其中的每一个具有一geography_id列,该列是相同的数据类型,并event.geography_id为外键入geography(地理提供关于事件的信息):

我遇到的问题是,使用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。
这将是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)
| 归档时间: |
|
| 查看次数: |
2242 次 |
| 最近记录: |