我有一个函数可以获取SQL代码并在其中插入计数字段并执行查询以返回其中的行数。目标是拥有一个动态SQL代码,并且能够获得它的记录数,无论它有什么代码,因为我在注册表过滤器窗口中使用它,我永远不知道可以生成什么代码,因为用户可以添加任意数量的代码过滤他/她想要的。
但是当我使用group by
子句时,结果是错误的,因为它计算主注册表出现的次数,因为在许多join
连接上使用了它。
上面代码的结果只应该是一行,其中包含10
列的结果,但是我得到了一个新表,第一行中的2
列为1
,而{{{ 1}}在其他行上。
如果我取消group by
条款,我将收到11
作为计数结果,但第一行将被计算两次。
如何获得单行和正确的数字?
SELECT
COUNT(*) QUERYRECORDCOUNT, // this line appears only in the Count() function
ARTISTA.*,
CATEGORIA.NOME AS CATEGORIA,
ATIVIDADE.NOME AS ATIVIDADE,
LOCALIDADE.NOME AS CIDADE,
MATRICULA.NUMERO AS MAP
FROM
ARTISTA
LEFT JOIN PERFIL ON PERFIL.REGISTRO = ARTISTA.ARTISTA_ID
LEFT JOIN CATEGORIA ON CATEGORIA.CATEGORIA_ID = PERFIL.CATEGORIA
LEFT JOIN ATIVIDADE ON ATIVIDADE.ATIVIDADE_ID = PERFIL.ATIVIDADE
LEFT JOIN LOCALIDADE ON LOCALIDADE.LOCALIDADE_ID = ARTISTA.LOCAL_ATIV_CIDADE
LEFT JOIN MATRICULA ON MATRICULA.REGISTRO = ARTISTA.ARTISTA_ID
WHERE
((ARTISTA.SIT_PERFIL <> 'NORMAL') AND (ARTISTA.SIT_PERFIL <> 'PRIVADO'))
GROUP BY
ARTISTA.ARTISTA_ID
ORDER BY
ARTISTA.ARTISTA_ID;
答案 0 :(得分:4)
这总是为您提供任何查询的行数:
Select count(*) as rowcount from
(
Paste your query here
) as countquery
答案 1 :(得分:3)
由于您是GROUPING BY ARTISTA.ARTISTA_ID
,COUNT(*) QUERYRECORDCOUNT
将返回每个ARTISTA.ARTISTA_ID
值的记录数。
如果您想要GLOBAL计数,则需要使用嵌套查询:
SELECT COUNT(*) AS QUERYRECORDCOUNT
FROM (SELECT
ARTISTA.*,
CATEGORIA.NOME AS CATEGORIA,
ATIVIDADE.NOME AS ATIVIDADE,
LOCALIDADE.NOME AS CIDADE,
MATRICULA.NUMERO AS MAP
FROM
ARTISTA
LEFT JOIN PERFIL ON PERFIL.REGISTRO = ARTISTA.ARTISTA_ID
LEFT JOIN CATEGORIA ON CATEGORIA.CATEGORIA_ID = PERFIL.CATEGORIA
LEFT JOIN ATIVIDADE ON ATIVIDADE.ATIVIDADE_ID = PERFIL.ATIVIDADE
LEFT JOIN LOCALIDADE ON LOCALIDADE.LOCALIDADE_ID = ARTISTA.LOCAL_ATIV_CIDADE
LEFT JOIN MATRICULA ON MATRICULA.REGISTRO = ARTISTA.ARTISTA_ID
WHERE
((ARTISTA.SIT_PERFIL <> 'NORMAL') AND (ARTISTA.SIT_PERFIL <> 'PRIVADO'))
GROUP BY
ARTISTA.ARTISTA_ID
ORDER BY
ARTISTA.ARTISTA_ID);
在这种情况下,您可能不需要选择那么多列。
如果您需要使用详细信息检索所有记录计数,那么最好使用两个单独的查询。