Функция MIN в вопросах SQL Server - PullRequest
0 голосов
/ 08 января 2019

Я использую этот запрос в моей рабочей области 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(min), что SQL Server 2014 не нравится, но этот агрегат действительно в выборе, или я здесь ошибаюсь?

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Если вы используете какой-то правильный псевдоним и некоторый правильный 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 необходим во втором WHERE (это уже в 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);

Чтобы повторить мой комментарий: Вредные привычки к удару: использование JOINs в старом стиле и, кроме того, Плохие привычки к удару: использование псевдонимов таблицы, таких как (a, b, c) или (t1, t2, t3) .

0 голосов
/ 08 января 2019

Да. Вам не хватает, что 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)
...
...