none
Função Minus SQL Server RRS feed

  • Pergunta

  • Galera, Feliz Natal

     Gostaria de utilizar a função em SQL chamada MINUS, porém já vi uns exemplos e não entendi muito a lógica o meu caso.

     Vejam o meu cenário.
     
     Tenho uma tabela onde armazeno todas as informações dos meus empregados (Empregado_ID, Nome, etc) e tenho uma tabela que faz a referência desses empregados na tabela Escala, que recebe dados como Data, Status do funcionário (folga, férias, atestado) e a própria ID do empregado, no meu caso, Empregado_ID.

     O que desejo fazer é o seguinte, em uma determinada drop, ele receba todos os empregados - os empregados que já foram inseridos na tabela de escala em determinada data, ou seja, estarei inserindo na tabela de escala os empregados e conforme ele for inserido nela, ele vai sendo retirado da drop, através dessa instrução minus.

     O problema que eu me deparo é exatamente com o mesmo número de Selects que deve ter que estão ocorrendo erros.

     Se alguém tem alguma idéia de como me auxiliar, fico grato.

     Até mais

    sábado, 23 de dezembro de 2006 19:28

Respostas

  • Galera,

        Consegui chegar a seguinte solução que ao invés de = usar IN (Valeu Marcelo) e a stored ficou assim.

    CREATE PROCEDURE BUSCAR_MOTORISTAS_DISPONIVEIS

    @DATA AS SMALLDATETIME

    AS

    SELECT EMPREGADO_ID, NOME
    FROM EMPREGADO_TBL
    WHERE EMPREGADO_ID IN

    (
    SELECT EMPREGADO_ID FROM EMPREGADO_TBL
    EXCEPT
    SELECT ITEM_DA_ESCALA_TBL.EMPREGADO_ID
    FROM ESCALA_TBL INNER JOIN ITEM_DA_ESCALA_TBL ON ESCALA_TBL.ESCALA_ID = ITEM_DA_ESCALA_TBL.ESCALA_ID
    WHERE ESCALA_TBL.DATA = @DATA
    )

    Obrigado pela força pessoal.

    terça-feira, 26 de dezembro de 2006 16:23

Todas as Respostas

  • tem como vc. colcoar exemplos com dados para gente olhar. qual a versao do seu sql server 2000 ou 2005 ?
    terça-feira, 26 de dezembro de 2006 09:08
  • Vinícuis,

    Mas esta função é documentada, estou procuando no Books On-Line do SQL Server 2000, e não encontrei.

    terça-feira, 26 de dezembro de 2006 13:07
  • o sql server nao tem esse operador como o ORACLE por exemplo, por isso se for possivel postar dados de exemplo e explicar melhor a necessidade.

     

    Abs;

    terça-feira, 26 de dezembro de 2006 13:13
  • Achei a seguinte solução.

    SELECT     EMPREGADO_ID, NOME
    FROM         EMPREGADO_TBL
    WHERE     EMPREGADO_ID =
                              (SELECT     EMPREGADO_ID
                                FROM          EMPREGADO_TBL
                                EXCEPT
                                SELECT     EMPREGADO_ID
                                FROM         ITEM_DA_ESCALA_TBL)

    Com a função MINUS não funcionou, mas com o EXCEPT funcionou muito bem, gerou os resultados esperados.

    Inicialmente ele me seleciona somente as ID's dos empregados que não estão na escala (empregados que não estão de folga, atestados ou férias) e posterior me mostra os nomes e as ID para abastecer minha caixa de seleção.

    Valeu pela força galera

     

    terça-feira, 26 de dezembro de 2006 13:21
  • Quando fiz a instrução não pensei nos vários registros que pudessem retornar, aí ela só funciona com um registros e não com vários, por que de uma relação de 10 empregados por exemplo, teremos 2 de folga e o resto está trabalhando, só que do meu jeito não du muito certo essa parte, eu consigo, saber somente quais são as ID's, mas os nomes as quais se referem eu não consigo saber.

    Alguém tem alguma idéia?

     

    terça-feira, 26 de dezembro de 2006 13:44
  • porque vc. nao usa o not in ?
    terça-feira, 26 de dezembro de 2006 14:07
  • Galera,

        Consegui chegar a seguinte solução que ao invés de = usar IN (Valeu Marcelo) e a stored ficou assim.

    CREATE PROCEDURE BUSCAR_MOTORISTAS_DISPONIVEIS

    @DATA AS SMALLDATETIME

    AS

    SELECT EMPREGADO_ID, NOME
    FROM EMPREGADO_TBL
    WHERE EMPREGADO_ID IN

    (
    SELECT EMPREGADO_ID FROM EMPREGADO_TBL
    EXCEPT
    SELECT ITEM_DA_ESCALA_TBL.EMPREGADO_ID
    FROM ESCALA_TBL INNER JOIN ITEM_DA_ESCALA_TBL ON ESCALA_TBL.ESCALA_ID = ITEM_DA_ESCALA_TBL.ESCALA_ID
    WHERE ESCALA_TBL.DATA = @DATA
    )

    Obrigado pela força pessoal.

    terça-feira, 26 de dezembro de 2006 16:23
  • Marcelo,

       É que aprendemos utilizando a função MINUS e eu nunca tinha feito esse tipo de instrução SQL funcionar, mas percebi em um livro de SQL que o operador MINUS não existe em SQL SERVER e sim somente o EXCEPT (ao menos na referência que tenho 'Aprenda em 24 Horas SQL3')

    Valeu pela força

    terça-feira, 26 de dezembro de 2006 16:27
  • Junior,

        A função MINUS do SQL SERVER é a EXCEPT,  só que eu não tinha percebido isso.

    Valeu pela força.

     

    terça-feira, 26 de dezembro de 2006 16:29
  • É nessas horas que vc sente a diferença sobre vedadeiros RDBs.

    huhuh


    efdusernet
    quinta-feira, 19 de agosto de 2010 01:51