【发布时间】:2012-11-13 19:50:11
【问题描述】:
我有一个函数,它获取一个 SQL 代码并在其中插入一个计数字段并执行查询以返回其中的行数。目标是拥有一个动态 SQL 代码,并且无论它有什么代码都能够获得它的记录数,因为我在注册表过滤器窗口中使用它,我永远不知道可能会生成什么代码,因为用户可以添加尽可能多的代码根据他/她的需要过滤。
但是当我使用group by 子句时,结果是错误的,因为它正在计算主注册表出现的次数,因为在许多join 连接上使用。
上面代码的结果应该只有一行,其列的结果为10,但我得到一个新表,第一列的第一列是2,另一行是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;
【问题讨论】:
-
如果你总是 LEFT JOIN,你可以简单地选择
COUNT(*) FROM ARTISTA WHERE...而不选择额外的行和额外的连接。 -
问题是我的函数将接收带有任意数量字段的 SQL 代码并加入,它必须更改 SQL 以将“计数”放在与结果相同的方式是原封不动的时候。