Sql server SQL Server问题中的MIN函数
我正在Access工作区中使用此查询: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
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);
重申我的评论:,另外。你说得对,我不习惯使用联接,但我需要开始使用它们,因为可读性要方便得多。谢谢你的提示。你说得对,我不习惯使用联接,但我需要开始使用它们,因为可读性要方便得多。谢谢你的提示