Duvida de SQL

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.

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

Que coisa chata isso não, rs.

E qual o erro que dá no SQL?

[quote=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[/quote]

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.

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?

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

xD mas beleza vlw pelo apoio ai.

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!

Isso não pode gerar um produto cartesiano?

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!

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

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 ?

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

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 ) ?

[quote=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 ) ?[/quote]

Oi,

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

Tchauzin!

[quote=lina][quote=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 ) ?[/quote]

Oi,

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

Tchauzin![/quote]

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

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

[quote=pmlm][quote=leonhard32]
Ja no Mysql, o uso de JOIN torna-se necessario.
[/quote]
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
[/quote]

É, 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

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