【问题标题】:Cannot reference alias of aggregate function in where clause of subquery不能在子查询的 where 子句中引用聚合函数的别名
【发布时间】:2013-06-08 06:45:27
【问题描述】:

我在使用这个 select 语句时遇到问题:

SELECT
  field1,
  MIN(field2) AS MinOfField2,
  (SELECT id FROM table2 WHERE something = MinOfField2) AS table2_id
FROM table1
GROUP BY field1

当我尝试执行此查询时,访问会弹出一个对话框,要求我输入“MinOfField2”的参数值。

首先我尝试在子查询中直接使用聚合函数,但这似乎也不被允许。

我能找到的最接近的现有问题是:Access alias in subquery

【问题讨论】:

    标签: sql ms-access aggregate-functions ms-access-2003 subquery


    【解决方案1】:

    我相信这是您要查找的查询:

    SELECT 
        t1.field1, 
        t1.MinOfField2,
        table2.id AS table2_id
    FROM
        (
            SELECT 
                field1, 
                MIN(field2) AS MinOfField2
            FROM table1 
            GROUP BY field1
        ) t1
        INNER JOIN
        table2
            ON t1.MinOfField2=table2.something
    

    【讨论】:

    • 好的,我想我明白你在做什么了。所以基本上答案是不可能在子查询中引用别名?
    • @Zalumon 正确,子查询不能引用在自身外部创建的别名,因此 Gord 使用了带有连接的派生表。附带说明一下,使用派生表几乎总是比子选择快:)
    • @Matt 感谢您的确认。我相信派生表更快,但就我的口味而言,这个语句已经过于复杂(这意味着我以后每次看它时至少需要 15 分钟才能理解它在做什么)。子选择对我来说似乎更具可读性。我几乎总是选择可读性而不是性能。我最终通过分两步完成我的任务来解决这个问题,完全避免了这种 SQL。
    • @Zalumon 很抱歉,但在这种情况下,我真的必须建议您复习一下您的 SQL,这是使用派生查询的一个非常简单的示例,应该不难阅读背部。我不确定开发是为您一个人还是为客户开发,但性能通常应该先于可读性,特别是如果差异很大,对于大型数据集它们将是:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多