Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Michael.Dev

[Resolvido] Retornar mais de 1 coluna na SubQuery

Recommended Posts

Pessoas, estou com problemas, preciso retornar os telefones que a pessoa possui, mas, só consegui fazer ele retornar uma coluna, precisaria retornar o NUMERO do telefone da TB_TELEFONES, e o TIPO do TELEFONE.

 

 SELECT 
			   p.NOME_RAZAO,
			   (
			     SELECT tbTel.NUMERO, tbTel.TIPO_TEL
			            FROM tb_Telefones AS tbTel
			            WHERE tbTel.ID_PESSOA IN(p.ID_PESSOA)
			   ) 
			    AS Telefones
			FROM 
				tb_Pessoas AS p
			WHERE  p.EMITENTE = @EMITENTE
				OR p.CLIENTE = @CLIENTE
				OR p.FUNCIONARIO = @FUNCIONARIO
				OR p.FORNECEDOR = @FORNECEDOR
				OR p.TRANSPORTADOR = @TRANSPORTADOR   
				AND 
				   p.CLIENTE_PF_PJ = @TIPO_PESSOA
				AND
				   p.STATUS = @SITUACAO   
		    ORDER 
		        BY p.NOME_RAZAO DESC

 

Agradeço desde já pessoal.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola, tem certeza que essa modelagem esta correta ?

- Nesse tipo de caso, um simples join resolveria ao meu ver, até mesmo porque o uso de sub-querys utiliza-se de um processamento alem do recomendável, embora essa seja uma consulta simples.

 

-- Se a modelagem estiver correta.

SELECT p.nome_razao, t.numero, t.tipo_tel
FROM tb_pessoas p
INNER JOIN tb_telefones t ON p.id_telefone  = t.id_telefone
WHERE  p.emitente = @EMITENTE 
       OR p.cliente = @CLIENTE 
       OR p.funcionario = @FUNCIONARIO 
       OR p.fornecedor = @FORNECEDOR 
       OR p.transportador = @TRANSPORTADOR 
          AND p.cliente_pf_pj = @TIPO_PESSOA 
          AND p.status = @SITUACAO 
ORDER  BY p.nome_razao DESC 


-- Como me parece estar:

SELECT p.nome_razao, t.numero, t.tipo_tel
FROM tb_pessoas p
INNER JOIN tb_telefones t ON t.id_pessoa  = p.id_pessoa
WHERE  p.emitente = @EMITENTE 
       OR p.cliente = @CLIENTE 
       OR p.funcionario = @FUNCIONARIO 
       OR p.fornecedor = @FORNECEDOR 
       OR p.transportador = @TRANSPORTADOR 
          AND p.cliente_pf_pj = @TIPO_PESSOA 
          AND p.status = @SITUACAO 
ORDER  BY p.nome_razao DESC 

 

Espero ter ajudado, abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sem querer entrar no mérito da modelagem.

Se entendi bem que juntar o numero com o tipo.

pode concatenar.

Ex:

SELECT 
                                  p.NOME_RAZAO,
                                  (
                                    SELECT tbTel.NUMERO+tbTel.TIPO_TEL
                                           FROM tb_Telefones AS tbTel
                                           WHERE tbTel.ID_PESSOA IN(p.ID_PESSOA)
                                  ) 
                                   AS Telefones
                               FROM 
                                       tb_Pessoas AS p
                               WHERE  p.EMITENTE = @EMITENTE
                                       OR p.CLIENTE = @CLIENTE
                                       OR p.FUNCIONARIO = @FUNCIONARIO
                                       OR p.FORNECEDOR = @FORNECEDOR
                                       OR p.TRANSPORTADOR = @TRANSPORTADOR   
                                       AND 
                                          p.CLIENTE_PF_PJ = @TIPO_PESSOA
                                       AND
                                          p.STATUS = @SITUACAO   
                           ORDER 
                               BY p.NOME_RAZAO DESC

 

 

 

Atenciosamente

Felipe Filho

Skype: felipe.calixto

Mobile: + 55 34 9198 9984

Site: sawicontroladoria.tk

Blog: sawiblog.sytes.net

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não quero concatenar, quero trazer todos os telefones, tipos telefones referente a uma pessoa ID_PESSOA

 

estou com um relacionamento de 1:N, 1 Pessoas com N's Telefones

Compartilhar este post


Link para o post
Compartilhar em outros sites

Falaram no post #2 e post #3 de fazer um JOIN... não seria o caso?

Se repetir as linhas, utilize a funcao PIVOT TABLE para colocar as linhas em colunas. Não vejo complicação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Falaram no post #2 e post #3 de fazer um JOIN... não seria o caso?

Se repetir as linhas, utilize a funcao PIVOT TABLE para colocar as linhas em colunas. Não vejo complicação.

Amigo, como uso esta função?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, como uso esta função?

 

Está na mão:

http://msdn.microsoft.com/pt-br/library/ms177410.aspx

 

Cuidado com performance, se for o seu caso.

 

Com joins deu certo sua consulta? Qual a versão do SQLServer?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Está na mão:

http://msdn.microsoft.com/pt-br/library/ms177410.aspx

 

Cuidado com performance, se for o seu caso.

 

Com joins deu certo sua consulta? Qual a versão do SQLServer?

 

Amigo, já tinha feito com joins, porém rele irá repetir os registros. A versão do SQLSERVER que estou utilizando é a EXPRESS 2008 R2.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, já tinha feito com joins, porém rele irá repetir os registros.

A versão do SQLSERVER que estou utilizando é a EXPRESS 2008 R2.

 

então no seu caso recomendo o uso do Pivot Table.

De uma olhada neste caso:

http://forum.imasters.com.br/topic/224865-transformando-varias-linhas-em-uma-so-coluna/

 

aBÇS

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galerinha, consegui resolver meu problema, vlw rapazeada, A.jr....

 

Deem uma olhada pra vocês verem como ficou:

 

 

USE[DBSYS]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE SPFiltroAgendaPessoas
(
   @TIPO_PESSOA NVARCHAR(50),
   @EMITENTE NVARCHAR(50),
   @CLIENTE NVARCHAR(50),
   @FUNCIONARIO NVARCHAR(50),
   @FORNECEDOR NVARCHAR(50),
   @TRANSPORTADOR NVARCHAR(50),
   @SITUACAO NVARCHAR(20)
)
AS
BEGIN
 --tabela temporaria
       create table #temp (NUMERO varchar(50), NOMEPESSOA varchar(4000))

       --select distinct para buscar somente pessoas que estejam 
       --cursor x: produtos
       declare x cursor for select distinct tb_Pessoas.ID_PESSOA, NOME_RAZAO from tb_Pessoas
                               inner join tb_Telefones on tb_Telefones.ID_PESSOA = tb_Pessoas.ID_PESSOA
                                 WHERE  tb_Pessoas.EMITENTE = @EMITENTE
								OR tb_Pessoas.CLIENTE = @CLIENTE
								OR tb_Pessoas.FUNCIONARIO = @FUNCIONARIO
								OR tb_Pessoas.FORNECEDOR = @FORNECEDOR
								OR tb_Pessoas.TRANSPORTADOR = @TRANSPORTADOR   
								AND 
								   tb_Pessoas.CLIENTE_PF_PJ = @TIPO_PESSOA
								AND
								   tb_Pessoas.STATUS = @SITUACAO   
       --variaveis para o cursor x
       declare @ID_TELEFONE int
       declare @NUMERO_TEL varchar(50)
       --variável para concatenar o nome dos fornecedores
       declare @NOME_PESSOA_conc varchar(8000)
       open x
       fetch next from x into @ID_TELEFONE,@NUMERO_TEL
       while @@fetch_Status=0
       begin
               --zerando variável de concatenação
               set @NOME_PESSOA_conc = ''
               --cursor y: fornecedores relacionados com os produtos, vai concatenar os fornecedores na variável @NOM_FORNECEDOR_conc
               declare y cursor for select tb_Telefones.NUMERO from tb_Pessoas
                                       inner join tb_Telefones on tb_Telefones.ID_PESSOA = tb_Pessoas.ID_PESSOA
                                       where tb_Telefones.ID_PESSOA = @ID_TELEFONE
               --variavel para o cursor y
               declare @NOME_PESSOA varchar(50)
               open y
               fetch next from y into @NOME_PESSOA
               while @@fetch_Status=0
               begin
                       --concatenando fornecedores na variável @NOM_FORNECEDOR_conc
                       set @NOME_PESSOA_conc = @NOME_PESSOA_conc + @NOME_PESSOA + ', '

                       --loop do cursor y
                       fetch next from y into @NOME_PESSOA
               end
               --fim do cursor y
               close y
               deallocate y  

               --retira última virgula
               set @NOME_PESSOA_conc = substring(@NOME_PESSOA_conc, 1, len(@NOME_PESSOA_conc)-1)
               --insere na tabela virtual
               insert into #temp (NOMEPESSOA, NUMERO )
               values (@NOME_PESSOA_conc, @NUMERO_TEL)

               --loop do cursor x
               fetch next from x into @ID_TELEFONE,@NUMERO_TEL
       end
       --fim do cursor x
       close x
       deallocate x

       --consulta da tabela temporaria
       select * from #temp

       --apagando tabela temporaria
       drop table #temp
       --apagando tabelas para testes
END
GO

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entao.

Cuidado com o uso do cursor. Performance vai pro espaço com seu uso.

Onde trabalho atualmente ateh a palavra cursor eh proibida :P

 

Eu passo o exemplo abaixo para as pessoas com quem trabalho como exemplo:

 

declare @au_id char( 11 )

set rowcount 0

select au_id,au_lname,au_fname into #mytemp from authors

set rowcount 1

select @au_id = au_id from #mytemp

while @@rowcount <> 0

begin

set rowcount 0

select au_id,au_lname,au_fname from #mytemp

where au_id = @au_id

delete #mytemp where au_id = @au_id

set rowcount 1

select @au_id = au_id from #mytemp

end

set rowcount 0

 

 

É bem mais rápido e acho que você pode ajustar para o seu caso.

 

Boa sorte e que bom que deu certo!

 

Abçs

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.