0

我有一个函数,它获取一个 SQL 代码并在其中插入一个计数字段并执行查询以返回其中的行数。目标是拥有一个动态 SQL 代码,并且无论它有什么代码都能够获得它的记录计数,因为我在注册表过滤器窗口中使用它,我永远不知道可能会生成什么代码,因为用户可以添加尽可能多的代码根据他/她的需要过滤。

但是当我使用该group by子句时,结果是错误的,因为它正在计算由于在许多join连接上使用而出现的主注册表的次数。

上面代码的结果应该只有一行,其中的列10作为结果,但是我得到一个新表,其中第一列2在第一行中,而1在其他行中。

如果我取消该group by子句,我将收到 a11作为计数结果,但第一行将被计算两次。

我应该怎么做才能获得单行和正确的数字?

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;
4

2 回答 2

4

这总是为您提供任何查询的行数:

Select count(*) as rowcount from
(

     Paste your query here

) as countquery
于 2012-11-13T19:55:12.240 回答
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);

在这种情况下,您可能不需要选择那么多列。

如果您需要检索带有详细信息的所有记录计数,那么最好使用两个单独的查询。

于 2012-11-13T19:57:35.830 回答