Usuário com melhor resposta
Consultar e extrair dados de duas tabelas

Pergunta
-
Pessoal,
Tenho o seguinte problema.
Tenho duas tabelas uma chamada CHASSI e outra chamada SERVIÇO.
O que acontece? -> Para cada dado tipo chassi podem existir até 3 serviços (A, B, C).
No chassi 1 existem os serviços A, B, C.
No chassi 2 existem os serviços B, C.
No chassi 3 existem os serviços A, B, C.
Como selecionar por pesquisa somente o chassi que não possui o serviço 'A'???
Deixei de forma mais simples que o código. Então, como retornar o resultado do chassi que não possui o serviço 'A'?
Segue código:
SELECT DISTINCT EMPRESAS.NOME, VEICULOS.DATA_VENDA, PRODUTOS_MODELOS.DESCRICAO_MODELO, VEICULOS.CHASSI_COMPLETO, OS_DADOS_VEICULOS.NUMERO_OS, OS.TIPO, OS_SERVICOS.COD_SERVICO FROM EMPRESAS EMPRESAS, VEICULOS VEICULOS , PRODUTOS_MODELOS PRODUTOS_MODELOS , OS_DADOS_VEICULOS OS_DADOS_VEICULOS, OS OS , OS_SERVICOS OS_SERVICOS WHERE (VEICULOS.COD_EMPRESA = EMPRESAS.COD_EMPRESA) AND (PRODUTOS_MODELOS.COD_PRODUTO = VEICULOS.COD_PRODUTO) AND (PRODUTOS_MODELOS.COD_MODELO = VEICULOS.COD_MODELO) AND (OS_DADOS_VEICULOS.COD_EMPRESA = VEICULOS.COD_EMPRESA) AND (OS_DADOS_VEICULOS.COD_MODELO = VEICULOS.COD_MODELO) AND (OS_DADOS_VEICULOS.COD_PRODUTO = VEICULOS.COD_PRODUTO) AND (OS_DADOS_VEICULOS.CHASSI = VEICULOS.CHASSI_COMPLETO) AND (OS.NUMERO_OS = OS_DADOS_VEICULOS.NUMERO_OS) AND (OS.COD_PRODUTO = OS_DADOS_VEICULOS.COD_PRODUTO) AND (OS.COD_MODELO = OS_DADOS_VEICULOS.COD_MODELO) AND (OS.COD_EMPRESA = OS_DADOS_VEICULOS.COD_EMPRESA) AND (OS_SERVICOS.COD_EMPRESA = OS.COD_EMPRESA) AND (OS_SERVICOS.NUMERO_OS = OS.NUMERO_OS) AND ( ( VEICULOS.DATA_NOTA >= TO_DATE('2014/10/01','YYYY/MM/DD') ) AND ( VEICULOS.DATA_NOTA < TO_DATE('2014/11/01','YYYY/MM/DD') ) AND (( OS_SERVICOS.COD_SERVICO = 'A' ))) ORDER BY EMPRESAS.NOME, VEICULOS.DATA_VENDA
Se poderem me dar uma luz sobre como resolver isso eu agradeço!!!!
- Editado Ericsson Berg terça-feira, 4 de novembro de 2014 13:05
Respostas
-
Deleted
- Sugerido como Resposta Durval RamosModerator segunda-feira, 5 de janeiro de 2015 22:12
Todas as Respostas
-
Ericsson, bom dia!
Para que sua SQL funcione, você terá que usar o comando LEFT JOIN no seu FROM e retirar essas cláusulas do WHERE onde você está igualando um campo ao outro.
Ex.:
FROM EMPRESAS EMPRESAS INNER JOIN VEICULOS VEICULOS ON (VEICULOS.COD_EMPRESA = EMPRESAS.COD_EMPRESA)
INNER JOIN PRODUTOS_MODELOS PRODUTOS_MODELOS ON (PRODUTOS_MODELOS.COD_PRODUTO = VEICULOS.COD_PRODUTO)
INNER JOIN OS_DADOS_VEICULOS OS_DADOS_VEICULOS ON (OS_DADOS_VEICULOS.COD_EMPRESA = VEICULOS.COD_EMPRESA AND OS_DADOS_VEICULOS.COD_MODELO = VEICULOS.COD_MODELO AND OS_DADOS_VEICULOS.COD_PRODUTO = VEICULOS.COD_PRODUTO AND OS_DADOS_VEICULOS.CHASSI = VEICULOS.CHASSI_COMPLETO)
INNER JOIN OS OS LEFT JOIN OS_SERVICOS OS_SERVICOS ON ( AQUI VOCE COLOCA A AMARRACAO DE ACORDO COM A PESQUISA QUE FIZER SOBRE O LEFT JOIN ) -
Ericsson Berg, Boa Tarde !
Cara, analisei o seu código e deixei-lo assim:
SELECT DISTINCT EMPRESAS.NOME,
VEICULOS.DATA_VENDA,
PRODUTOS_MODELOS.DESCRICAO_MODELO,
VEICULOS.CHASSI_COMPLETO,
OS_DADOS_VEICULOS.NUMERO_OS,
OS.TIPO,
OS_SERVICOS.COD_SERVICO
FROM
EMPRESAS AS EMPRESAS
INNER JOIN VEICULOS AS VEICULOS ON VEICULOS.COD_EMPRESA = EMPRESAS.COD_EMPRESA
INNER JOIN PRODUTOS_MODELOS AS PRODUTOS_MODELOS ON PRODUTOS_MODELOS.COD_PRODUTO = VEICULOS.COD_PRODUTO
AND PRODUTOS_MODELOS.COD_MODELO = VEICULOS.COD_MODELO
INNER JOIN OS_DADOS_VEICULOS AS OS_DADOS_VEICULOS ON OS_DADOS_VEICULOS.CHASSI = VEICULOS.CHASSI_COMPLETO
INNER JOIN OS AS OS ON OS.NUMERO_OS = OS_DADOS_VEICULOS.NUMERO_OS
INNER JOIN OS_SERVICOS AS OS_SERVICOS ON OS_SERVICOS.NUMERO_OS = OS.NUMERO_OS
WHERE
VEICULOS.DATA_NOTA BETWEEN '2014/10/01 00:00:00.000' AND '2014/11/01 23:59:59.000'
AND NOT EXISTS
(
SELECT OS_DADOS_VEICULOS1.CHASSI
FROM
OS_DADOS_VEICULOS AS OS_DADOS_VEICULOS1
INNER JOIN OS_SERVICOS AS OS_SERVICOS1 ON OS_DADOS_VEICULOS1.NUMERO_OS = OS_SERVICOS1.NUMERO_OS
WHERE
OS_DADOS_VEICULOS.CHASSI = OS_DADOS_VEICULOS1.CHASSI
AND OS_SERVICOS1.COD_SERVICO = 'A'
)
ORDER BY EMPRESAS.NOME, VEICULOS.DATA_VENDAExecuta ai e me passa um retorno, blz !!!
-
-
-
-
Deleted
- Sugerido como Resposta Durval RamosModerator segunda-feira, 5 de janeiro de 2015 22:12
-
-
-
Passa a estrutura das tabelas
- Sugerido como Resposta Ricardo Barbosa Cortes quarta-feira, 5 de novembro de 2014 12:39
- Não Sugerido como Resposta Durval RamosModerator segunda-feira, 5 de janeiro de 2015 22:11