如何在此SQL查询中使用COUNT?

时间:2014-11-07 13:03:43

标签: php sql sql-server sql-server-2008 records

我的问题非常简单,我需要计算这个查询有多少结果,因为在这个丑陋的数据库中有太多的记录,并且PHP代码使用了太多的内存来提取所有记录。我将计算此查询生成的记录数量,并且使用PHP我将使用循环一次拉出10k条记录。

这是查询:

SELECT p.Email,
            c.ID_Cliente,
            c.DataHoraUltimaAtualizacaoILR,
            p.Nome, 
            upper(substring(p.Nome, 1, charindex(' ', p.Nome + ' '))) as 'PrimeiroNome',
            p.DataHoraCadastro, 
            p.Sexo, 
            p.EstadoCivil, 
            p.DataNascimento, 
            getdate() as [today],
            datediff (yy,p.DataNascimento,getdate()) as 'Idade',
            datepart(month,p.DataNascimento) as 'MesAniversario',
            e.Bairro,
            e.Cidade, 
            e.UF, 
            c.CodLoja as codloja_cadastro,
            t.DDD,
            t.Numero
from PessoaFisica p
left join Cliente c on (c.ID_Pessoa = p.ID_PessoaFisica)
left join Loja l on (cast(l.CodLoja as integer) = cast(c.CodLoja as integer))
left join PessoaEndereco pe on (pe.ID_Pessoa = p.ID_PessoaFisica)
left join Endereco e on (e.ID_Endereco = pe.ID_Endereco)
left join PessoaTelefone pt on (pt.ID_Pessoa = p.ID_PessoaFisica)
left join Telefone t on (t.ID_Telefone = pt.ID_Telefone)
where p.Email is not NULL and p.Email <> ''
group by p.Email, c.ID_Cliente, p.Nome, p.EstadoCivil, p.DataHoraCadastro, c.CodLoja, p.Sexo, e.Bairro, p.DataNascimento, e.Cidade, e.UF, c.DataHoraUltimaAtualizacaoILR, t.DDD, t.Numero

我已经尝试了这个(下面的)但是计数与此查询的结果总数不同,它必须匹配:

SELECT COUNT(p.Email)
FROM PessoaFisica p
left join Cliente c on (c.ID_Pessoa = p.ID_PessoaFisica)
left join Loja l on (cast(l.CodLoja as integer) = cast(c.CodLoja as integer))
left join PessoaEndereco pe on (pe.ID_Pessoa = p.ID_PessoaFisica)
left join Endereco e on (e.ID_Endereco = pe.ID_Endereco)
left join PessoaTelefone pt on (pt.ID_Pessoa = p.ID_PessoaFisica)
left join Telefone t on (t.ID_Telefone = pt.ID_Telefone)
where p.Email is not NULL and p.Email <> ''

我正在使用MS SQL Server

3 个答案:

答案 0 :(得分:1)

尝试将您的查询置于SELECT COUNT(*) FROM (...) AS tbl内,如下所示

SELECT COUNT(*) FROM
(
    SELECT 
        p.Email,
        c.ID_Cliente,
        c.DataHoraUltimaAtualizacaoILR,
        p.Nome, 
        upper(substring(p.Nome, 1, charindex(' ', p.Nome + ' '))) as 'PrimeiroNome',
        p.DataHoraCadastro, 
        p.Sexo, 
        p.EstadoCivil, 
        p.DataNascimento, 
        getdate() as [today],
        datediff (yy,p.DataNascimento,getdate()) as 'Idade',
        datepart(month,p.DataNascimento) as 'MesAniversario',
        e.Bairro,
        e.Cidade, 
        e.UF, 
        c.CodLoja as codloja_cadastro,
        t.DDD,
        t.Numero
    from PessoaFisica p
    left join Cliente c on (c.ID_Pessoa = p.ID_PessoaFisica)
    left join Loja l on (cast(l.CodLoja as integer) = cast(c.CodLoja as integer))
    left join PessoaEndereco pe on (pe.ID_Pessoa = p.ID_PessoaFisica)
    left join Endereco e on (e.ID_Endereco = pe.ID_Endereco)
    left join PessoaTelefone pt on (pt.ID_Pessoa = p.ID_PessoaFisica)
    left join Telefone t on (t.ID_Telefone = pt.ID_Telefone)
    where p.Email is not NULL and p.Email <> ''
    group by p.Email, c.ID_Cliente, p.Nome, p.EstadoCivil, p.DataHoraCadastro, 
    c.CodLoja, p.Sexo, e.Bairro, p.DataNascimento, e.Cidade, e.UF, 
    c.DataHoraUltimaAtualizacaoILR, t.DDD, t.Numero
) AS tbl

答案 1 :(得分:0)

在@ ekad的回答之后:

您不应选择所有字段并执行所有计算来计算结果,您也只能使用一列或标量值:

SELECT COUNT(*) FROM
(
    SELECT 
        1
    from PessoaFisica p
    left join Cliente c on (c.ID_Pessoa = p.ID_PessoaFisica)
    left join Loja l on (cast(l.CodLoja as integer) = cast(c.CodLoja as integer))
    left join PessoaEndereco pe on (pe.ID_Pessoa = p.ID_PessoaFisica)
    left join Endereco e on (e.ID_Endereco = pe.ID_Endereco)
    left join PessoaTelefone pt on (pt.ID_Pessoa = p.ID_PessoaFisica)
    left join Telefone t on (t.ID_Telefone = pt.ID_Telefone)
    where p.Email is not NULL and p.Email <> ''
    group by p.Email, c.ID_Cliente, p.Nome, p.EstadoCivil, p.DataHoraCadastro, 
    c.CodLoja, p.Sexo, e.Bairro, p.DataNascimento, e.Cidade, e.UF, 
    c.DataHoraUltimaAtualizacaoILR, t.DDD, t.Numero
) AS tbl

答案 2 :(得分:0)

这也可能有效:

;with cte (Email,ID_Cliente,DataHoraUltimaAtualizacaoILR,Nome, PrimeiroNome,DataHoraCadastro, 
Sexo, EstadoCivil, DataNascimento, today,Idade,MesAniversario,Bairro,Cidade, 
UF, codloja_cadastro,DDD,numero) as 
(
...... your query.....
)
select count(*) from cte