【问题标题】:MIN function in SQL Server issuesSQL Server 问题中的 MIN 函数
【发布时间】:2019-06-03 06:04:45
【问题描述】:

我在我的 Access 工作区中使用这个查询:

cnn_.Execute "UPDATE a SET a.trasco_id_object = b.pratica " & _
                 "FROM trasco_utilizzi_oggetto a, oggetti_pratica b, pratiche_tributo c, denunce_ici d " & _
                 "WHERE c.pratica = D.pratica AND b.pratica = c.pratica AND a.oggetto = b.oggetto " & _
                 "AND b.pratica = (SELECT MIN(b.pratica) FROM oggetti_pratica bb WHERE c.pratica = d.pratica AND bb.pratica = c.pratica AND bb.oggetto = b.oggetto)"

但是使用这个我得到以下错误:

聚合可能不会出现在 WHERE 子句中,除非它出现在 HAVING 子句或选择列表中包含的子查询中,并且被聚合的列是外部引用。

现在,我想的问题是 SQL Server 2014 不喜欢的select(min),但该聚合确实在选择中,还是我在这里犯了错误?

【问题讨论】:

标签: sql-server min


【解决方案1】:

如果你使用一些适当的别名,以及一些适当的 JOIN 语法,它会使问题更容易被发现:

UPDATE tuo
SET trasco_id_object = op.pratica
FROM trasco_utilizzi_oggetto tuo
     JOIN oggetti_pratica op ON tuo.oggetto = op.oggetto
     JOIN pratiche_tributo pt ON op.pratica = pt.pratica
     JOIN denunce_ici di ON pt.pratica = di.pratica
WHERE op.pratica = (SELECT MIN(op.pratica)
                    FROM oggetti_pratica sq
                    WHERE pt.pratica = di.pratica
                      AND sq.pratica = pt.pratica
                      AND sq.oggetto = op.oggetto);

具体来说,请注意MIN(op.pratica),但该表的别名为sq。应该是MIN(sq.pratica)

我也怀疑第二个WHERE 是否需要pt.pratica = di.pratica(它已经在ON 中)。因此您的查询变为:

UPDATE tuo
SET trasco_id_object = op.pratica
FROM trasco_utilizzi_oggetto tuo
     JOIN oggetti_pratica op ON tuo.oggetto = op.oggetto
     JOIN pratiche_tributo pt ON op.pratica = pt.pratica
     JOIN denunce_ici di ON pt.pratica = di.pratica
WHERE op.pratica = (SELECT MIN(sq.pratica)
                    FROM oggetti_pratica sq
                    WHERE sq.pratica = pt.pratica
                      AND sq.oggetto = op.oggetto);

重申我的评论:Bad habits to kick: Using old style JOINs,此外还有Bad habits to kick : using table aliases like (a, b, c) or (t1, t2, t3)

【讨论】:

  • 你说得对,我不习惯使用连接,但我需要开始使用它们,因为可读性要方便得多。谢谢你的提示
【解决方案2】:

是的。你错过了oggetti_pratica b 在外部FROM 子句中,所以sum(b.pratica) 是外部查询的聚合。

你可能想要bb.pratica

...
b.pratica = (SELECT MIN(bb.pratica) FROM oggetti_pratica bb WHERE c.pratica = d.pratica AND bb.pratica = c.pratica AND bb.oggetto = b.oggetto)
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 2012-07-07
    • 2021-12-21
    • 1970-01-01
    • 2016-03-22
    • 2014-12-02
    相关资源
    最近更新 更多