none
Consultar e extrair dados de duas tabelas RRS feed

  • 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
    terça-feira, 4 de novembro de 2014 12:44

Respostas

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 )
    terça-feira, 4 de novembro de 2014 13:40
  • 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_VENDA

    Executa ai e me passa um retorno, blz !!!

    terça-feira, 4 de novembro de 2014 15:14
  • Tentei mas sem resultado.

    Palavra chave-não encontrada...

    terça-feira, 4 de novembro de 2014 16:23
  • Executei e deu erro: Comando SQL não encerrado adequadamente.

    E olhei, olhei e não achei o que tá errado!!

    terça-feira, 4 de novembro de 2014 16:24
  • Deleted
    terça-feira, 4 de novembro de 2014 17:22
  • Deleted
    terça-feira, 4 de novembro de 2014 17:36
  • Ericsson,

    essa Query está sendo executada no SQL Server(T-SQL) ou no Oracle(PL\SQL) ?


    terça-feira, 4 de novembro de 2014 18:00
  • Tem como você passar a estrutura das tabelas .. pra que possamos testar elas aqui...?
    terça-feira, 4 de novembro de 2014 18:37
  • Passa a estrutura das tabelas
    terça-feira, 4 de novembro de 2014 18:37