Sql server SQL Server问题中的MIN函数

Sql server SQL Server问题中的MIN函数,sql-server,min,Sql Server,Min,我正在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

我正在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子句或select列表中包含的子查询中,并且被聚合的列是外部引用


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

是的。您缺少
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)
...

对。您缺少
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)
...

如果您使用一些适当的别名和一些适当的
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)

我还怀疑第二个
中是否需要
pt.pratica=di.pratica
,其中
已经在
中了。因此,您的查询变成:

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

重申我的意见:,此外。

如果使用适当的别名和适当的
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)

我还怀疑第二个
中是否需要
pt.pratica=di.pratica
,其中
已经在
中了。因此,您的查询变成:

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

重申我的评论:,另外。

你说得对,我不习惯使用联接,但我需要开始使用它们,因为可读性要方便得多。谢谢你的提示。你说得对,我不习惯使用联接,但我需要开始使用它们,因为可读性要方便得多。谢谢你的提示