我正在更新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),我有以下错误:
错误:列&#34; table_a.creation_date_time&#34;必须出现在 GROUP BY子句或用于聚合函数 第5行:ORDER BY table_a.creation_date_time DESC
如果我添加GROUP BY table_a.creation_date_time,它会给我一个包含N行的表。 我已经阅读了很多关于DBMS如何允许您省略GROUP BY子句中的列的内容。现在,我只是感到困惑。
对于那些好奇的人来说,C ++方法是:
static int count(const QString &table, const QString &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() && query.isSelect() && query.first())
{
bool ok = false;
success = query.value(0).toInt(&ok);
if (ok == false)
{
success = -1;
return success;
}
}
}
}
return success;
}
答案 0 :(得分:1)
如果您只是在表上执行count(*)
以获得单个标量值结果,那么肯定存在order by
已经过时了吗?
溶液
删除过时的order by
以获取跨多个dbms的“标准”查询行为