Desafio SQL - Solução
Prezado internauta,
Neste artigo, apresento a resposta do desafio SQL. Trata-se de um problema genérico de “inversão de papéis”, ou seja, existem situações em que precisamos mostrar o conteúdo de diversas linhas (registros) em apenas uma. Observe a solução abaixo:
SELECT C.NOME,
TRES.FONE RESIDENCIAL,
TFAX.FONE FAX,
TCEL.FONE CELULAR
FROM CLIENTES C LEFT OUTER JOIN TELEFONES TRES ON
(C.CODIGO=TRES.CODIGO AND TRES.TIPO='RES')
LEFT OUTER JOIN TELEFONES TFAX ON
(C.CODIGO=TFAX.CODIGO AND TFAX.TIPO='FAX')
LEFT OUTER JOIN TELEFONES TCEL ON
(C.CODIGO=TCEL.CODIGO AND TCEL.TIPO='CEL')
ORDER BY C.NOME
Neste caso, utilizamos o LEFT OUTER JOIN para poder mostrar todos os registros da tabela de CLIENTES, mesmo não havendo ocorrência na tabela de TELEFONES – neste caso, o valor do campo FONE é nulo. Essa operação é necessária para cada tipo de telefone existente.
Vale lembrar que esta consulta foi validada no SGBD MySQL versão 4.
Para minha surpresa, recebi muitos emails, precisamente 45, até o dia 13/05 às 14:30h, quando finalizei este artigo.
Os leitores mandaram soluções testadas em diversos SGBDs – MySQL, Oracle, Firebird, entre outros. Outros ainda mandaram solução usando stored procedure. Olhei a estrutura de todas as consultas mas não tive como “rodar” as soluções de outros SGBDs. Em alguns casos rodei a solução no próprio MySQL.
Outro detalhe interessante é que alguns leitores, bastante atentos, observaram uma falha conceitual no script SQL – criação da tabela de TELEFONES. Observe:
... CREATE TABLE TELEFONES
(CODIGO INTEGER,
TIPO CHAR(3) NOT NULL ,...
A definição do campo código deveria ter a cláusula NOT NULL, ficando dessa forma:
... CREATE TABLE TELEFONES
(CODIGO INTEGER NOT NULL,
TIPO CHAR(3) NOT NULL, ...
Abaixo os nomes das pessoas que acertaram, pela ordem de chegada dos emails.
Parabéns a todos!!
Everton Garcia
Júlio Souza
Leonardo Jordão
Lucimar Santos
Claudio Souza
Rodrigo Fernandes
Anderson Ouverney
Wagner Crivelini
Robson Branco
Marcelo Colla
Ederson Selvati
Cristiano Rebonatto
Fabricio Baptista
Cristiano Scofield
Giovani Decusati
Demetrius Nogueira
Marcin Babinski
Roberto Enomoto
Carlos Braga
Romildo Cruz
Bruno Andrade
Jony Ridel
João Almeida
Daniel Garcia
Daniel Gonçalves
Claudio Silva
Vanius Girodo
Luthiano Vasconcelos
Everton Bomfim
Marcelo Nashiro
Gustavo Ribeiro
Ivo Christian
César Alencar
A seguir encontram-se relacionados trechos de alguns dos e-mails recebidos:
Marcelo Nashiro |
Thursday, May 13, 2004 5:32 AM |
select clientes.nome, res.[# Fone] as 'residencial', fax.[# Fone] as 'fax', cel.[# Fone] as 'celular'
from clientes
left outer join telefones res on clientes.[# codigo] = res.[# codigo] and res.[# tipo] = 'res'
left outer join telefones fax on clientes.[# codigo] = fax.[# codigo] and fax.[# tipo] = 'fax'
left outer join telefones cel on clientes.[# codigo] = cel.[# codigo] and cel.[# tipo] = 'cel'
order by clientes.nome
Marcelo Nashiro Florence dos Santos
Assistente de Controladoria
Dentalcorp Asst. Odont. Internacional
|
Daniel Goncalves de Azevedo |
Thursday, May 13, 2004 4:00 AM |
E aí Reinaldo, tudo ok? Gostei muito do desafio lançado, bem legal e bem bolado
espero que haja mais desafios nas suas próximas publicações.
Para resolver o desafio utilizei o BD Oracle, e encontrei duas maneiras de resolver um problema como
o apresentado, ressalto que há mais maneiras de se obter o resultado:
select cli.nome,
t1.fone RESIDENCIAL,
t2.fone FAX,
t3.fone CELULAR
from clientes cli,
telefones t1,
telefones t2,
telefones t3
where cli.codigo = t1.codigo(+)
and cli.codigo = t2.codigo(+)
and cli.codigo = t3.codigo(+)
and t1.tipo(+) = 'RES'
and t2.tipo(+) = 'FAX'
and t3.tipo(+) = 'CELULAR'
order by cli.nome;
Comentários: Desta maneira forço o resultado mesmo que não haja dados
na coluna 3,4 ou 5.
____________________________________________________________________
select cli.nome,
(select tel.fone
from telefones tel
where tel.codigo = cli.codigo
and tel.tipo = 'RES') RESIDENCIAL,
(select tel.fone
from telefones tel
where tel.codigo = cli.codigo
and tel.tipo = 'FAX') FAX,
(select tel.fone
from telefones tel
where tel.codigo = cli.codigo
and tel.tipo = 'CEL') CELULAR
from clientes cli
order by cli.nome;
Comentários: Neste segundo exemplo utiliza a opção de SELECT
dentro da cláusula SELECT onde consisto os dados que estou selecionando.
________________________________________________________________________
Gostaria de receber de você um feedback ou um comentário seu sobre as rotinas
que escrevi(se estão corretas ou não).
Obrigado e até a próxima.
Daniel Gonçalves de Azevedo
|
Lucimar Santos /
Marco A. Mendonça |
Monday, May 10, 2004 9:55 AM |
Solução do Teste (script em Oracle):
SELECT A.CODIGO,
A.NOME,
(SELECT B.FONE
FROM TELEFONES B
WHERE B.CODIGO = A.CODIGO
AND B.TIPO = 'RES') RESIDENCIAL,
(SELECT B.FONE
FROM TELEFONES B
WHERE B.CODIGO = A.CODIGO
AND B.TIPO = 'FAX') FAX,
(SELECT B.FONE
FROM TELEFONES B
WHERE B.CODIGO = A.CODIGO
AND B.TIPO = 'CEL') CELULAR
FROM CLIENTES A
ORDER BY A.NOME
PS: Caso um cliente possua mais de um telefone "Residencial" ou "Celular" ou "Fax"
esse script acima não funciona, precisaria ver como se deseja o resultado nesse caso.
Lucimar dos Santos
Marco Antonio Mendonça
|
Anderson Ouverney |
Monday, May 10, 2004 5:41 PM |
Prezado Reinaldo Viana Alvares, estou enviando a resposta ao Desafio SQL, espero que esteja tudo correto.
Fiz os teste utilizando o postgresql
Um abraço
Anderson.
SELECT CLIENTES.NOME,
(SELECT TELEFONES.FONE FROM TELEFONES
WHERE TELEFONES.TIPO='RES' AND TELEFONES.CODIGO=CLIENTES.CODIGO) AS RESIDENCIAL,
(SELECT TELEFONES.FONE FROM TELEFONES
WHERE TELEFONES.TIPO='FAX' AND TELEFONES.CODIGO=CLIENTES.CODIGO) AS FAX,
(SELECT TELEFONES.FONE FROM TELEFONES
WHERE TELEFONES.TIPO='CEL' AND TELEFONES.CODIGO=CLIENTES.CODIGO) AS CELULAR
FROM CLIENTES< BR>ORDER BY CLIENTES.NOME;
|
Gustavo Siqueira Ribeiro |
Thursday, May 13, 2004 5:47 AM |
Prezado Reinaldo, Segue abaixo a query que retorna o resultado do primeiro
desafio, publicado em sua coluna na SQL Magazine.
SELECT C.NOME AS NOME
, RES.FONE AS RESIDENCIAL
, FAX.FONE AS FAX
, CEL.FONE AS CELULAR
FROM CLIENTES C
, (SELECT CODIGO, FONE FROM TELEFONES T WHERE TIPO
= 'RES') RES
, (SELECT CODIGO, FONE FROM TELEFONES T WHERE TIPO
= 'FAX') FAX
, (SELECT CODIGO, FONE FROM TELEFONES T WHERE TIPO
= 'CEL') CEL
WHERE RES.CODIGO (+) = C.CODIGO
AND FAX.CODIGO (+) = C.CODIGO
AND CEL.CODIGO (+) = C.CODIGO
ORDER BY C.NOME
OBS.: Para resolver este desafio, utilizei o Oracle versão
7.34
Atenciosamente,
Gustavo Siqueira Ribeiro.
|
Bruno S. Andrade |
Wednesday, May 12, 2004 10:02 AM |
caro Reinaldo Viana,
segue abaixo a instrução sql do desafio que você colocou no site,lembrando que a consulta foi criada no
banco firebird.
select
c.nome, (select t1.fone from telefones t1 where t1.tipo = 'RES' and
t1.codigo = c.codigo) as Residencial,
(select t1.fone from telefones t1 where t1.tipo = 'FAX' and
t1.codigo = c.codigo) as Fax,
(select t1.fone from telefones t1 where t1.tipo = 'CEL' and
t1.codigo = c.codigo) as Celular
from clientes c left join telefones t
on c.codigo = t.codigo
and c.codigo <> (select c2.codigo from clientes c2 where c2.codigo = c.codigo)
order by 1
Bruno S. Andrade
Desenvolvedor
Ecos Sistemas - Natal/RN
|
Vanius Girodo |
Thursday, May 13, 2004 4:57 AM |
Bom dia Reinaldo.
Verifiquei o desafio apenas hoje, 13/05.
Não trabalho, ainda, com MYSQL. Para o resultado que obtive utilizei o SQL Server.
A query é a seguinte:
SELECT CL.Nome,
(SELECT RES.Fone
FROM Telefones RES
WHERE RES.Codigo = CL.Codigo
AND RES.Tipo = 'RES') RESIDENCIAL,
(SELECT FAX.Fone
FROM Telefones FAX
WHERE FAX.Codigo = CL.Codigo
AND FAX.Tipo = 'FAX') FAX,
(SELECT CEL.Fone
FROM Telefones CEL
WHERE CEL.Codigo = CL.Codigo
AND CEL.Tipo = 'CEL') CELULAR
FROM Clientes CL
ORDER BY CL.Nome
O resultado foi o seguinte:
Nome RESIDENCIAL FAX CELULAR
------------------------------ ------------ ------------ ------------
ALCIDES 26215478 25652225 88554785
MARCIO NULL NULL 88887777
NICOLAS 23536740 22629912 NULL
WILKIE NULL NULL NULL
Gostaria de saber se tem uma outra forma de fazer isto, para o caso de termos mais tipos de telefones...
Abraços,
Vanius Girodo
Analista de sistemas - Venture Assessoria Empresarial
|
Joao Almeida |
Wednesday, May 12, 2004 7:33 PM |
Olá, segue query de resposta. SELECT NOME,
(SELECT FONE FROM TELEFONES WHERE TIPO='RES' AND C.CODIGO = CODIGO) AS RESIDENCIAL,
(SELECT FONE FROM TELEFONES WHERE TIPO='FAX' AND C.CODIGO = CODIGO) AS FAX,
(SELECT FONE FROM TELEFONES WHERE TIPO='CEL' AND C.CODIGO = CODIGO) AS CELULAR
FROM CLIENTES C
ORDER BY NOME
Até mais,
João Almeida
Microsoft Certified Database Administrator
Microsoft Certified Professional
|
Claudio Paranhos de Souza |
Monday, May 10, 2004 11:57 AM |
Prezado Reinaldo, é um prazer estar participando de sua coluna. Tenho
acompanhado o trabalho da equipe SQL-Magazine e cada vez aprendo mais com
vocês. Esta coluna é muito interessante, espero que faça um grande sucesso.
Segue abaixo o script da criação da Stored Procedure (MS-SQL 6.5) que traz
como resultado as informações solicitadas no desafio.
----------------------------------------------------------------------------
if exists (select * from sysobjects where id =
object_id('dbo.sp_ClientesTelefones') and sysstat & 0xf = 4)
drop procedure dbo.sp_ClientesTelefones
GO
CREATE PROCEDURE sp_ClientesTelefones AS
select Codigo, Fone into #tmpRes from Telefones where Tipo = 'RES'
select Codigo, Fone into #tmpFax from Telefones where Tipo = 'FAX'
select Codigo, Fone into #tmpCel from Telefones where Tipo = 'CEL'
select Nome, Res.Fone as Residencial, Fax.Fone as Fax, Cel.Fone as Celular
from Clientes
left join #tmpRes as Res on Clientes.Codigo = Res.Codigo
left join #tmpFax as Fax on Clientes.Codigo = Fax.Codigo
left join #tmpCel as Cel on Clientes.Codigo = Cel.Codigo
order by Clientes.Nome
GO
-- Resultado da execução -----------------------------------------------------
Nome Residencial Fax Celular
------------------------------ ------------ ------------ ------------
ALCIDES 26215478 25652225 88554785
MARCIO (null) (null) 88887777
NICOLAS 23536740 22629912 (null)
WILKIE (null) (null) (null)
(4 row(s) affected)
----------------------------------------------------------------------------
Grato pela atenção!!!
Claudio Paranhos de Souza
|
Robson Rosa Branco |
Tuesday, May 11, 2004 4:37 AM |
Fala Reinaldo!
Como vai o mestrado? Como ficou seu projeto?
Mande noticias!
Em tempo, ai vai a minha resposta a sua brincadeira
SELECT CLI.NOME, RES.FONE RESIDENCIAL, FAX.FONE FAX, CEL.FONE CELULAR FROM CLIENTE CLI
LEFT JOIN TELEFONES RES ON ((RES.CODIGO = CLI.CODIGO) AND (RES.TIPO = 'RES')
LEFT JOIN TELEFONES FAX ON ((FAX.CODIGO = CLI.CODIGO) AND (FAX.TIPO = 'FAX')
LEFT JOIN TELEFONES CEL ON ((CEL.CODIGO = CLI.CODIGO) AND (CEL.TIPO = 'CEL')
ORDER BY CLI.CODIGO
Robson Branco <>><
|
Jony Ridel |
Wednesday, May 12, 2004 1:43 PM |
> Reinaldo,
>
> Segue o comando abaixo referente ao desafio SQL. Caso eu encontre outra
> solução enviarei outro e-mail.
>
> SELECT
> C.NOME,
> (SELECT F.FONE FROM TELEFONES F WHERE F.CODIGO = C.CODIGO AND
> F.TIPO='RES') AS RESIDENCIAL,
> (SELECT F.FONE FROM TELEFONES F WHERE F.CODIGO = C.CODIGO AND
> F.TIPO='FAX') AS FAX,
> (SELECT F.FONE FROM TELEFONES F WHERE F.CODIGO = C.CODIGO AND
> F.TIPO='CEL') AS RESIDENCIAL
> FROM
> CLIENTES C
> ORDER BY
> C.NOME
>
> Atenciosamente,
>
> Jony Ridel
> Programador
> Proton Sistemas-Feira de Santana-BA
|
Everton Garcia |
Friday, May 07, 2004 7:55 PM |
Caro Reinaldo, abaixo está o SQL do desafio:
select CLI.Nome,
(select TEL.fone from TELEFONES TEL
where TEL.codigo = CLI.Codigo
and TEL.Tipo = 'RES') As RESIDENCIAL,
(select TEL.fone from TELEFONES TEL
where TEL.codigo = CLI.Codigo
and TEL.Tipo = 'FAX') As FAX,
(select TEL.fone from TELEFONES TEL
where TEL.codigo = CLI.Codigo
and TEL.Tipo = 'CEL') As CELULAR
from CLIENTES CLI
order by Nome
[]´s e até o próximo desafio.
Everton Santos Garcia
Acadêmico de Análise de Sistemas - UFMS - 3º Ano
(3 anos trabalhando com Delphi e 2,5 com a linguagem SQL - totalmente autodidata)
|
Júlio César Silva Souza |
Saturday, May 08, 2004 4:25 PM |
> Reinaldo,
> Segue a resposta do seu desafio.
>
> -- =============================================
> SELECT
> CL1.NOME,
> TL1.FONE RESIDENCIAL,
> TL2.FONE FAX,
> TL3.FONE CELULAR
> FROM
> CLIENTES CL1
> LEFT JOIN TELEFONES TL1
> ON TL1.CODIGO = CL1.CODIGO
> AND TL1.TIPO = 'RES'
> LEFT JOIN TELEFONES TL2
> ON TL2.CODIGO = CL1.CODIGO
> AND TL2.TIPO = 'FAX'
> LEFT JOIN TELEFONES TL3
> ON TL3.CODIGO = CL1.CODIGO
> AND TL3.TIPO = 'CEL'
> ORDER BY
> CL1.NOME
> -- =============================================
>
> Sou novo, tenho 18 anos e adoro desafios!
> Gosto da ideia de ter algo dificil pela frente e você poder vencer.
> Apesar do eercicio acima ser fácil para mim, já que eu trabalho com isso o
> dia inteiro, resolvi responder.
>
> Um abraço.
>
> Júlio César da Silva Souza
> DBA e Programador
|
Cristiano Scofield |
Thursday, May 13, 2004 10:10 AM |
Realmente.
Como não "baixei" as tabelas, não testei. Mas teria percebido se tivesse executado. Abraços,
Cristiano Scofield.
----- Mensagem original -----
De: Reinaldo Viana [SMTP:reinaldo@sqlmagazine.com.br]
Enviada em: quinta-feira, 13 de maio de 2004 17:12
Para: Cristiano Scofield
Interessante sua resposta, apesar de que a linha
select c.nome,a.res,b.cel,c.fax
deve ser trocada por:
select c.nome,a.res,b.cel,d.fax
Abraços,
Reinaldo
----- Original Message -----
From: Cristiano Scofield
Sent: Tuesday, May 11, 2004 9:04 AM
Caro Especialista Reinaldo Viana Alvares,
segue minha resposta para o desafio.
select c.nome,a.res,b.cel,c.fax from clientes c
left outer join (select b.codigo,b.tipo,b.fone res from clientes a,telefones b where a.codigo = b.codigo
and b.tipo = 'RES') a on c.codigo = a.codigo
left outer join (select b.codigo,b.tipo,b.fone cel from clientes a,telefones b where a.codigo = b.codigo
and b.tipo = 'CEL') b on c.codigo = b.codigo
left outer join (select b.codigo,b.tipo,b.fone fax from clientes a,telefones b where a.codigo = b.codigo
and b.tipo = 'FAX') d on c.codigo = d.codigo
order by c.nome
Caso esteja errado ou exista uma maneira mais fácil de resolver, gostaria que me enviasse.
Gostaria de saber tb quando e onde o Sr. colocará a resposta ?
Sds,
Cristiano Scofield Souza Muniz
Analista de Sistemas
MultiCom.Net Tecnologia
|
Roberto Enomoto |
Tuesday, May 11, 2004 5:15 PM |
> O código sql segue abaixo:
>
> SELECT CLIENTES.NOME, T1.FONE RESIDENCIAL, T2.FONE FAX, T3.FONE CELULAR
> FROM
> ((CLIENTES LEFT JOIN TELEFONES T1 ON CLIENTES.CODIGO = T1.CODIGO AND
T1.TIPO =
> 'RES')
> LEFT JOIN TELEFONES T2 ON CLIENTES.CODIGO = T2.CODIGO AND T2.TIPO = 'FAX')
> LEFT JOIN TELEFONES T3 ON CLIENTES.CODIGO = T3.CODIGO AND T3.TIPO = 'CEL'
> ORDER BY CLIENTES.NOME
>
> Fico no aguardo de um retorno.
> Roberto Enomoto
|
Ivo Christian |
Thursday, May 13, 2004 6:19 AM |
Esta é a solução que encontrei usando MS-SQL Server
Select C.Nome, T3.Fone as Residencial, T2.Fone as FAX, T1.Fone as Celular
from Clientes C
Left Join Telefones T1 ON T1.Codigo = C.Codigo AND T1.Tipo = 'CEL'
Left Join Telefones T2 ON T2.Codigo = C.Codigo AND T2.Tipo = 'FAX'
Left Join Telefones T3 ON T3.Codigo = C.Codigo AND T3.Tipo = 'RES'
Order By Nome
Ivo Christian Araujo Carvalho
Programador Delphi - MS-SQL
Tribunal de Contas do Estado
Teresina - Piaui
Teresina
|
Marcelo Colla |
Tuesday, May 11, 2004 4:45 AM |
> Existe varias formas de fazer esta consulta usando cursor, while,
consultas
> derivadas, segue uma maneira de fazer:
>
> Select Nome,
> RESIDENCIAL = (Select Fone From Telefones Where Codigo = Clientes.Codigo
And
> Tipo = 'RES'),
> FAX = (Select Fone From Telefones Where Codigo = Clientes.Codigo And Tipo
=
> 'FAX'),
> CELULAR = (Select Fone From Telefones Where Codigo = Clientes.Codigo And
> Tipo = 'CEL')
> From Clientes
> Order By Nome
>
> -- SQL Server
>
> Abracos.
>
> Marcelo Colla
|
Romildo Benicio da Cruz Junior |
Wednesday, May 12, 2004 7:11 AM |
Bom dia Reinaldo!
Abaixo segue uma das respostas referente ao seu desafio, eu utilizei no Mysql 5.0 e funcionou.
Outro detalhe é que o arquivo que voce deixou para baixar e criar as tabelas, continha um erro.
Todo atributo chave primária deve ser Not Null, e voce não tina colocado isso, acho qie é melhor corrigir e disponibilizar novamente.
select clientes.nome,res as RESIDENCIAL,fax as FAX,cel as CELULAR
from clientes left join
(select codigo,fone as res from telefones
where tipo='RES') r
on clientes.codigo=r.codigo
left join
(select codigo,fone as fax from telefones
where tipo='FAX') f
on clientes.codigo=f.codigo
left join
(select codigo,fone as cel from telefones
where tipo='CEL') ce
on clientes.codigo=ce.codigo
order by clientes.nome
Atenciosamente,
Romildo Benicio da Cruz Junior
|
Carlos Braga |
Tuesday, May 11, 2004 5:18 PM |
> Segue o código que, penso eu, deva estar correto.
>
> SELECT
> CLIENTES.NOME,
> T1.FONE RESIDENCIAL,
> T2.FONE FAX,
> T3.FONE CELULAR
>
> FROM
> ((CLIENTES LEFT JOIN TELEFONES T1 ON CLIENTES.CODIGO = T1.CODIGO AND
T1.TIPO =
> 'RES')
> LEFT JOIN TELEFONES T2 ON CLIENTES.CODIGO = T2.CODIGO AND T2.TIPO = 'FAX')
> LEFT JOIN TELEFONES T3 ON CLIENTES.CODIGO = T3.CODIGO AND T3.TIPO = 'CEL'
>
> ORDER BY CLIENTES.NOME
>
> Aguardo seu retorno.
> Obrigado.
>
> Carlos Braga
|
Marcin Babinski |
Tuesday, May 11, 2004 4:41 PM |
> Caro Reinaldo,
>
> segue abaixo a solução para o problema apresentado no
> artigo "Desafio SQL", publicado no site
> www.sqlmagazine.com.br:
>
> SELECT C.nome,
> (SELECT fone FROM telefones WHERE codigo = c.codigo
> and tipo = 'RES') AS Residencial,
> (SELECT fone FROM telefones WHERE codigo = c.codigo
> and tipo = 'FAX') AS Fax,
> (SELECT fone FROM telefones WHERE codigo = c.codigo
> and tipo = 'CEL') AS Celular
> FROM Clientes C
> ORDER BY C.nome
>
> Atenciosamente,
>
> Marcin Gregory Babinski
|
Everton Bomfim |
Thursday, May 13, 2004 5:29 AM |
> Olá,
>
> A minha solução foi compilada no SQL Server 2000.
>
> Segue em anexo a consulta.sql
>
> Um Abraço
>
>
>
>
> Nome: Everton Bomfim de Souza
> Formação: Técnico em Processamento de Dados(nível médio)
> Estudante de Geofísica da Universidade Federal da Bahia
>
> Especialista em Delphi, SQL Server e InterBase
|
Reydeval Rocha |
Thursday, May 13, 2004 9:36 AM |
Olá,
Meu nome é Reydeval Rocha, trabalho na RedeBahia de Comunicação, sou Bacharel em Informática pela UCSal (Universidade Católica do Salvador) e Especialista em Sistemas Distribuídos pela UFBA (Universidade Federal da Bahia).
Atualmente sou responsável pelo BI (Business Intelligence) da RedeBahia. Também atuo como DBA construindo procedures extração de dados para alimentar o BI.
Sou professor de Linguagem C no curso de Egenharia Mecatrônica na FTC (Faculdade de Tecnologia e Ciências).
Abaixo segue a minha solução:
select NOME = cli.nome,
RESIDENCIAL = tel1.fone,
FAX = tel2.fone,
CELULAR = tel3.fone
from clientes cli,
telefones tel1,
telefones tel2,
telefones tel3
where cli.codigo *= tel1.codigo and
cli.codigo *= tel2.codigo and
cli.codigo *= tel3.codigo and
tel1.tipo = 'RES' and tel2.tipo = 'FAX' and tel3.tipo = 'CEL'
order by cli.nome
Atenciosamente,
Reydeval Rocha
Analista de Sistemas
TI-Rede Bahia de Comunicação
|
Daniel Garcia Ferreira |
Wednesday, May 12, 2004 8:26 PM |
De acordo com o Desafio da revista, ai está a resposta(SQL):
select a.nome,
(select fone from telefones where TIPO = 'RES' and codigo = a.codigo) as RESIDENCIAL,
(select fone from telefones where TIPO = 'FAX' and codigo =a.codigo) as FAX,
(select fone from telefones where TIPO = 'CEL' and codigo =a.codigo) as CELULAR
from Clientes a
order by nome
falow
__________________
Daniel Garcia Ferreira
Analista Programador
São Paulo/SP
|
Vagner R. Souza |
Thursday, May 13, 2004 7:54 AM |
Oi Reinaldo,
Gostaria de saber se vc. poderia me ajudar a resolver uma trigger. Nunca havia trabalhado com trigger, mas comecei a ler um livro de SQL Server e achei fácil e resolvi implementar no meu projeto que estou desenvolvendo. Basei todos os meus relatórios em cima de uma tabela que é o resultado triggers. Eu havia feito apenas as triggers de inserção, achei que fosse fácil e deixei para fazer as de alteração e deleção apos o termino. Qdo. me deparei com vários erros qdo. habilitei as triggers de alteração e deleção.
Estou tentando chegar em uma solução mas ate agora não consegui. Será que vc. poderia me ajudar a na construção desta trigger?
Caso afirmativo, estarei enviando o script das tabelas e as triggers que eu criei.
Desde ja agradeço pela atenção.
At.
Vagner
|
Israel Nascimento Boudoux |
Friday, May 14, 2004 4:55 AM |
Reinaldo, segue aí a query do desafio. QUERY:
SELECT CLI.NOME, (SELECT TEL.FONE
FROM TELEFONES TEL
WHERE TEL.CODIGO = CLI.CODIGO
AND TEL.TIPO = 'RES'
) AS RESIDENCIAL,
(SELECT TEL.FONE
FROM TELEFONES TEL
WHERE TEL.CODIGO = CLI.CODIGO
AND TEL.TIPO = 'FAX'
) AS FAX,
(SELECT TEL.FONE
FROM TELEFONES TEL
WHERE TEL.CODIGO = CLI.CODIGO
AND TEL.TIPO = 'CEL'
) AS CELULAR
FROM CLIENTES CLI
ORDER BY CLI.NOME
Aprovo a criação destes desafios, é uma iniciativa muito interessante da SQL Magazine. Grande abraço.
Atenciosamente,
--
Israel Nascimento Boudoux
Netra Tecnologia
Analista de Sistemas/Desenvolvedor
Sun Certified Programmer for Java 2 Plataform 1.4
|
|
|
Reinaldo
Viana Alvares (reinaldo@sqlmagazine.com.br) é
Tecnólogo em Processamento de Dados pela UNAMA - Universidade
da Amazônia, especialista em Análise de Sistemas pela
UFPA - Universidade Federal do Pará, mestrando em computação
pela UFF - Universidade Federal Fluminense, professor da UNISUAM
– Sociedade Unificada de Ensino Superior Augusto Motta e
editor da revista SQL Magazine. |
|
|
|
|