Home - www.devmedia.com.br

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.

  Funçoes de Data no SQL Server    
  Banco de Dados e Modelagem de Dados - Parte Final    
  Banco de Dados e Modelagem de Dados - Parte 2    
  Banco de Dados e Modelagem de Dados - Parte 1    
  Solução do Desafio SQL    
  Desafio SQL    
  Boas-Vindas    
     

 

Todos os direitos reservados: DevMedia Group
SQL Magazine - 2004