繁体   English   中英

解决子选择中的模糊列

Resolving an ambiguous column in a subselect

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

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

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

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)

这给出了错误:

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

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

我正在使用PostgreSQL 9.0.14。

3 个回复

在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)

你能把查询写成:

select
    e.event_id
from event e
    left join geography g 
      on (e.geography_id = g.geography_id)
where
    e.geography_id in (1,2,3)

这应该在逻辑上等效,或切换到:

where
    g.geography_id in (1,2,3)

得到只有匹配的回报(这会问为什么不使用内部联接)

加入之前将谓词向下拉入子查询:

SELECT e.event_id
FROM  (SELECT * FROM event WHERE geography_id IN (1,2,3)) e
LEFT   JOIN geography g ON (g.geography_id = e.geography_id);

结果与原始查询完全相同:

SELECT e.event_id
FROM   event e
LEFT   JOIN geography g USING (geography_id)
WHERE  geography_id in (1,2,3);

只是替代方案应该更快(尽早排除不相关的行)。 对于变通方法来说,这是一个可以接受的副作用。

2 解决MySQL模糊列而不添加表名前缀和不使用子查询的情况

我有一个失败的查询,其中包含不明确的列错误。 不幸的是,由于我正在使用的框架(Magento 1),我不能仅通过在“ where”子句中为列名加上正确的表名来解决此问题。 给定两个示例表 我想要一个查询,该查询将colA和colD上的表,仅选择colC和colE ,但在T1的co ...

2016-10-30 12:42:10 1 94   mysql/ sql
3 如何解决子选择查询中的死锁?

当我尝试使用子选择进行UPDATE时,我陷入了死锁。 我在使用Hibernate从DB中获取数据的应用程序中捕获了此死锁,并在日志中看到了下一个: 当我从查询中删除子选择时,它解决了死锁,但是在我的情况下,这些子查询是必需的。 带选择死锁的嵌套更新 https://www. ...

4 Teradata中的模糊列

我有一张桌子,其中一列有一对多的关系。 这是例子 现在我正在尝试拉所有然后基于严重性的多个条目,所以我这样做 在这里,如果你看到我试图把service name从子查询,而不是从主表,以避免越来越多的条目已经选择了我与severity.I同样得到一个错误味精ambigous列S ...

6 为什么在子查询中不能选择多个列?

我一直在做这个查询 回答我的Operand should contain 1 column(s)而 完美地工作。 为什么MariaDB不会让我子查询超过1列? 我想念什么吗? 正如这个问题( MySQL-Operand应该包含1列 )所暗示的那样, 您可能会回答 ...

7 选择未知列中的mysql子查询

我在select语句中有一个子查询,我需要根据基本查询找到一个计数。 如果我对需要计数的course_id进行硬编码(否则该计数仅针对同一课程而不是未列出的所有课程),但是当我更改为使用列出的course_id时,它将返回1054-未知列错误。 错误SQL 返回值:MySQL说: ...

2015-07-03 03:15:30 1 310   mariadb
9 在oracle中模糊定义的列

我不是sql专家。 我试图在我的oracle sqlplus提示符下运行以下查询 并得到以下错误 一点点我能理解的是, accountsTable JOIN loadTable ON num=accNum和loadTable JOIN loanTable ON loadTabl ...

10 解决有序列表中的模糊类别

让我们举一个具体的例子,希望我能清楚。 假设(有序)月份列表: 1月<2月<3月<... <12月 (用整数代表几个月,零基础),这样 Jan是0,2月是1,...,Dec是11。 现在假设我无法访问月份的全名,并且给出了以下列表,其 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM