sql - 解决子选择中的不明确列

标签 sql postgresql join subquery left-join

我在使用 ON 从两个联接表之间具有共享名称的子选择中选择列时遇到问题连接表达式语法。

我有两个表,eventgeography每个都有一个geography_id列,这是相同的数据类型,event.geography_idgeography 的外键(地理提供有关事件的信息):

simplified ERD from Dia

我遇到的问题是,在使用 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/

相关文章:

php - MySQL 查询不考虑 GROUP BY

sql - 计算sqlite中的相邻记录数

mysql - 我的数据库中可以有 100 万个表吗?

mysql - 对每组不同的行进行单次 MySQL 查找

c# - 左加入 Linq 查询

java - 有没有办法在构造完成后读取PreparedStatement 的SQL 查询?

java - 如何在 Java 中使用准备好的语句进行选择查询?

postgresql - 如何在 Postgres 中使用数组作为变量?

sql - H2 与 PostgreSQL 生成的带有函数的列

mysql - 寻找产品的最早历史条目我应该加入历史/产品表还是在产品表中存储值?