Как использовать COUNT в этом SQL-запросе?

У меня очень простой вопрос, мне нужно посчитать, сколько результатов дает этот запрос, потому что в этой уродливой базе данных слишком много записей, а код PHP использует слишком много памяти для извлечения всех записей. Я собираюсь подсчитать, сколько записей генерирует этот запрос, и с помощью PHP я буду использовать цикл для извлечения 10 тыс. Записей одновременно.

Это запрос:

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

0

Решение

Попробуй поместить свой запрос внутрь 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

Другие решения

После ответа @ 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
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
0
По вопросам рекламы [email protected]