2014-11-07 5 views
0

내 질문은 정말 간단합니다.이 추악한 데이터베이스에 너무 많은 레코드가 있고 PHP 코드가 너무 많은 메모리를 사용하여 모든 레코드를 가져 오기 때문에이 쿼리에 얼마나 많은 결과가 있는지 계산해야합니다. 이 쿼리가 얼마나 많은 레코드를 생성하는지 계산할 것이고 PHP를 사용하면 루프를 사용하여 한 번에 10k 레코드를 가져올 것입니다. 이 SQL 쿼리에서 COUNT를 사용하는 방법은 무엇입니까?

쿼리입니다 : 이미이 (노호) 시도

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 (... 첫 번째 쿼리를 여기에 넣으십시오 ...); – Multisync

+0

@Multisync 'from'키워드 근처의 구문이 잘못되었습니다. –

+0

위 쿼리와 count 결과를 원한다면 쿼리 후'select @@ rowcount'를 입력하십시오. 그렇지 않으면 @multisync가 제안한 대답이 작업을 수행합니다. 또한 'PrimeiroNome'으로 별칭을 지정할 필요가 없습니다. PrimeiroNome 또는 [PrimeiroNome] –

답변

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

내부 선택이 제대로 작동합니까? 그렇다면 위 쿼리도 작동해야합니다. – ekad

+0

나는 뭔가 잘못했지만 지금은 효과가 있습니다. –

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'이 아닌 컬럼 별칭이 필요합니다) – GarethD

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