Duvida de SQL

17 respostas
Vinicius_Zibetti_Res

Gente estou com uma duvida cruel aqui.
Vamos as tabelas:

Tabela diretoria
codigo | descricao
--------±-----------
PES | Pessoal
FIN | Financeira
PRD | Producao
MKT | Marketing

Tabela funcionario
matricula | nome | nascimento | salario | funcao | secao
-----------±----------------±-----------±--------±-------±------
45739 | Andre | 1983-08-03 | 1200.00 | 2 | CPG
34840 | Marta | 1979-11-15 | 2100.00 | 3 | ADM
38283 | Sandro | 1974-10-09 | 3800.00 | 1 | CRC
26360 | Luis | 1976-08-12 | 3400.00 | 4 | MAN
15730 | Ana | 1973-12-04 | 3000.00 | 4 | FPG
46373 | Sandra | 1983-09-14 | 1400.00 | 2 |
36392 | Marcos | 1971-04-21 | 2900.00 | 4 | CRC
29847 | Luana | 1972-03-26 | 3800.00 | 1 | FPG
19463 | Pedro | 1984-10-05 | 1200.00 | 2 | ADM
28912 | Nanci | 1972-01-29 | 4600.00 | 1 | MAN
30472 | Paula | 1976-08-20 | 3500.00 | 4 | MAN
40528 | Fabio | 1973-03-15 | 2400.00 | 3 | MAN
22189 | Andreia | 1982-07-21 | 1300.00 | 2 | FPG
30352 | Raquel | 1974-04-30 | 2200.00 | 3 | CPG

Tabela secao:
codigo | descricao | diretoria
--------±-----------±----------
ADM | Admissao | PES
FPG | Folha Pgto | PES
CPG | Ct a Pagar | FIN
CRC | Ct Receber | FIN
MAN | Manufatura | PRD
QLD | Qualidade | PRD

Exercicio que tenho que fazer:
descrição da diretoria, descrição da seção e nome do
funcionário, para as diretorias/secoes que tenham
funcionários

Minha resposta: SELECT diretoria.descricao,secao.descricao , funcionario.nome FROM funcionario INNER JOIN (diretoria JOIN secao ON secao.diretoria = diretoria.codigo) ON funcionario.secao = secao.codigo AND diretoria.codigo = secao.diretoria;

Só que esta errada minha resposta, tenho certeza…
Alguem pode me ajudar com este problema ? Obrigado.

17 Respostas

rafaduka

considerando que o tipo da colulna ‘secao’ seja null na tabela funcionario

SELECT d.descricao, s.descricao, f.nome
FROM funcionarios f
INNER JOIN secao s ON f.secao = s.codigo
INNER JOIN diretoria d ON = s.diretoria = d.diretoria
WHERE f.secao == NOT NULL;

obs: ñ testei talvez ñ funcione, faça as adaptações necessárias

L

Que coisa chata isso não, rs.

E qual o erro que dá no SQL?

Vinicius_Zibetti_Res

rafaduka:
considerando que o tipo da colulna ‘funcao’ seja null na tabela funcionario

SELECT d.descricao, s.descricao, f.nome
FROM funcionarios f
INNER JOIN secao s ON f.secao = s.codigo
INNER JOIN diretoria d ON = s.diretoria = d.diretoria
WHERE f.secao == NOT NULL;

obs: ñ testei talvez ñ funcione, faça as adaptações necessárias

Olha, não funcionou do jeito que eu esperava, mas da onde voce tirou a funcao ?
É pra mostra as infos dos funcionarios que possuam alguma diretoria/secao…
Alias, funcionou até mais voce acha que é isto mesmo que o exercicio quer ?
O resultado do seu é igual ao resultado da SQL que eu postei ali em cima.

rafaduka

escrevi errado, já alterei lá…
sobre a questão, a coluna de relacionamento na sua tabela funcionario é a ‘secao’.

exibindo as seções que não estejam nulas, logo, exibirá as secoes/diretorias que tenham funcionários? certo?

Vinicius_Zibetti_Res

Olha cara, sinceramente, eu acho que este exercicio está meio mal formulado, dai está confundindo agente…

xD mas beleza vlw pelo apoio ai.

lina

Oi,

Será que precisa mesmo de INNER JOIN ?

select DRT.descricao, SEC.descricao,  FUNC.funcionario from DIRETORIA DRT, FUNCIONARIO FUNC, SECAO SEC where SEC.codigo	= FUNC.secao;

Tchauzin!

rafaduka

Isso não pode gerar um produto cartesiano?

lina

Oi,

Esqueci de colocar um AND no where:

select DRT.descricao, SEC.descricao, FUNC.funcionario from DIRETORIA DRT, FUNCIONARIO FUNC, SECAO SEC where SEC.codigo = FUNC.secao and DRT.codigo = SEC.diretoria;

Tchauzin!

pmlm

Tendo em conta que um registo de funcionario não tem seccao, não deveria ser outer seccao?

Vinicius_Zibetti_Res

Não não, o professor disse q era soh usando JOIN inclusive o OUTER (FULL, RIGHT e LEFT)…
xD.
pmlm, como ficaria usando outer secao ?

leonhard32

Fala!

Fiz uma “copia” do seu banco aqui, testei e deu certo.

SELECT 
  diretoria.descricao,
  secao.descricao, 
  funcionario.nome 
FROM secao 

INNER JOIN diretoria   ON diretoria.codigo = secao.diretoria 
INNER JOIN funcionario ON funcionario.secao = secao.codigo

Acredito que você só tenha mesmo é se perdido um pouco na hora de usar os JOINs.
Qualquer duvida, só falar.

[]'s

Vinicius_Zibetti_Res

O segundo teste que eu fiz, ficou asssim: SELECT diretoria.descricao, secao.descricao, funcionario.nome FROM funcionario INNER JOIN secao ON funcionario.secao = secao.codigo INNER JOIN diretoria ON secao.diretoria = diretoria.codigo;

que resulta no mesmo do: SELECT diretoria.descricao,secao.descricao , funcionario.nome FROM funcionario INNER JOIN (diretoria JOIN secao ON secao.diretoria = diretoria.codigo) ON funcionario.secao = secao.codigo AND diretoria.codigo = secao.diretoria;

‘–’… Mas vcs acham que é isso mesmo a resposta desse problema ( usando JOIN ) ?

lina

Vinicius Zibetti Resko:
O segundo teste que eu fiz, ficou asssim: SELECT diretoria.descricao, secao.descricao, funcionario.nome FROM funcionario INNER JOIN secao ON funcionario.secao = secao.codigo INNER JOIN diretoria ON secao.diretoria = diretoria.codigo;

que resulta no mesmo do: SELECT diretoria.descricao,secao.descricao , funcionario.nome FROM funcionario INNER JOIN (diretoria JOIN secao ON secao.diretoria = diretoria.codigo) ON funcionario.secao = secao.codigo AND diretoria.codigo = secao.diretoria;

‘–’… Mas vcs acham que é isso mesmo a resposta desse problema ( usando JOIN ) ?

Oi,

Acho que está correto. O resultado deve ser o mesmo do select sem usar JOIN.

Tchauzin!

leonhard32

lina:
Vinicius Zibetti Resko:
O segundo teste que eu fiz, ficou asssim: SELECT diretoria.descricao, secao.descricao, funcionario.nome FROM funcionario INNER JOIN secao ON funcionario.secao = secao.codigo INNER JOIN diretoria ON secao.diretoria = diretoria.codigo;

que resulta no mesmo do: SELECT diretoria.descricao,secao.descricao , funcionario.nome FROM funcionario INNER JOIN (diretoria JOIN secao ON secao.diretoria = diretoria.codigo) ON funcionario.secao = secao.codigo AND diretoria.codigo = secao.diretoria;

‘–’… Mas vcs acham que é isso mesmo a resposta desse problema ( usando JOIN ) ?

Oi,

Acho que está correto. O resultado deve ser o mesmo do select sem usar JOIN.

Tchauzin!

Bom, não tenho certeza, acho que isso depende do banco de dados.
Sei que o Oracle não é necessario o uso de JOIN, somente realizando as ligações entre tabelas através do WHERE.
Ja no Mysql, o uso de JOIN torna-se necessario.

[]'s

pmlm

AFAIK o uso da palavra JOIN não é obrigatório no Mysql.

Isto é valido:

SELECT a.* FROM tabA a, tabB b WHERE a.code = b.a_code

leonhard32

pmlm:
leonhard32:

Ja no Mysql, o uso de JOIN torna-se necessario.

AFAIK o uso da palavra JOIN não é obrigatório no Mysql.

Isto é valido:

SELECT a.* FROM tabA a, tabB b WHERE a.code = b.a_code

É, dessa eu não sabia… mas desde sempre o Mysql faz isso?
Pois me lembro que a um bom tempo atraz, eu não consegui fazer

pmlm

Já há muito tempo que não uso SQL. Mas sempre usei queries dessa forma.

Criado 6 de março de 2012
Ultima resposta 7 de mar. de 2012
Respostas 17
Participantes 6