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

0

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

Это запрос:

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

Теги:
sql-server
sql-server-2008
records

3 ответа

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
  • 0
    Это не сработало (неправильный синтаксис рядом с ключевым словом 'from'.)
  • 1
    Вы уверены, что внутренний выбор работает? Если это так, вышеуказанный запрос также должен работать.
Показать ещё 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
  • 1
    Оптимизатор SQL Server достаточно умен, чтобы знать, что эти поля не нужны, и отправленный вами запрос и запрос, отправленный @ekad, приведут к тому же плану выполнения. Единственным преимуществом этого является то, что он более разборчивый, а намерение более четкое (хотя вам нужно будет использовать псевдоним столбца, а не просто SELECT 1 )
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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню