Столбец должен отображаться в предложении GROUP BY или использоваться в агрегатной функции

#postgresql #count #group-by #sql-order-by #aggregate-functions

#postgresql #количество #group-by #sql-order-by #агрегатные функции

Вопрос:

Я обновляю программное обеспечение Qt, чтобы сделать его совместимым как с SQLite, так и с PostgreSQL. У меня есть метод C , который используется для подсчета элементов заданной таблицы с заданными предложениями.

В SQLite сработало следующее и дало мне число N (количество).

 SELECT COUNT(*) FROM table_a 
INNER JOIN table_b AS
ON table_b.fk_table_a = table_a.id
WHERE table_a.start_date_time <> 0
ORDER BY table_a.creation_date_time DESC
  

В PostgreSQL (я использую 9.3) у меня следующая ошибка :

ОШИБКА: столбец «table_a.creation_date_time» должен отображаться в предложении GROUP BY или использоваться в агрегатной функции СТРОКА 5: ПОРЯДОК ПО table_a.creation_date_time DESC

Если я добавлю, GROUP BY table_a.creation_date_time , это даст мне таблицу с N строками. Я много читал о том, как разные СУБД позволяют опускать столбцы в предложении GROUP BY . Теперь я просто в замешательстве.


Для тех, кому интересно, метод C :

 static int count(const QString amp;table, const QString amp;clauses = QString(""))
{
    int success = -1;

    if (!table.isEmpty())
    {
        QString statement = QString("SELECT COUNT(*) FROM ");
        statement.append(table);
        if (!clauses.isEmpty())
        {
            statement.append(" ").append(clauses)   ;
        }
        QSqlQuery query;
        if(!query.exec(statement))
        {
            qWarning() << query.lastError();
            qWarning() << statement;
        }
        else
        {
            if (query.isActive() amp;amp; query.isSelect() amp;amp; query.first())
            {
                bool ok = false;
                success = query.value(0).toInt(amp;ok);
                if (ok == false)
                {
                    success = -1;
                    return success;
                }
            }
        }
    }

    return success;
}
  

Комментарии:

1. Тогда SQLite И MySQL «расслаблены».

Ответ №1:

Если вы просто выполняете a count(*) в таблице, чтобы получить результат с одним скалярным значением, то, конечно, наличие order by present устарело?

решение

Удалите устаревшее order by , чтобы получить «стандартное» поведение запросов в нескольких СУБД

Комментарии:

1. Жена: Я хочу пить. Я: Вот стакан воды. Жена: Я не просила стакан воды, я хотела, чтобы ты сочувствовал мне в моих проблемах с жаждой. Я: Извини, детка, я все об устранении проблемы

2. Кэмпбелл, я видел, что это работает, если я удаляю ORDER BY table_a.creation_date_time DESC . Дело в том, что при вызове метода параметр clauses уже содержит оператор GROUP BY . Возможно, мне следует удалять это утверждение перед каждым вызовом метода, поскольку, как вы говорите, я использую только одно скалярное значение каждый раз, когда я его вызываю.

3. бах. трусливое удаление комментария @a_horse_with_no_name 😉

4. Я не знаю, что произошло с комментарием @a_horse_with_no_name . Я увидел, что он уже был удален, когда я ответил на него. Он процитировал меня, чтобы сказать мне, что MySQL «расслаблен» в своем способе обработки оператора GROUP BY, который некоторые люди считают ошибкой или чем-то в этом роде.