我在使用 ON
从两个联接表之间具有共享名称的子选择中选择列时遇到问题连接表达式语法。
我有两个表,event
和 geography
每个都有一个geography_id
列,这是相同的数据类型,event.geography_id
是 geography
的外键(地理提供有关事件的信息):
我遇到的问题是,在使用 ON
连接这两个表时,我无法引用它们之间的共享列。语法,但在使用 USING
时有效语法。
我意识到 USING
之所以有效,是因为它 suppresses redundant columns , 但由于该语句使用许多不同的连接表,这些表的模式经常发生变化,所以我宁愿尽可能明确。
我遇到问题的具体 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)
这给出了错误:
ERROR: column reference "geography_id" is ambiguous
LINE 8: x.geography_id in (1,2,3)
我正在使用 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)
关于sql - 解决子选择中的不明确列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29356680/