none
Excluir conjunto de resultados RRS feed

  • Pergunta

  • Preciso excluir os registros de acordo com o resultado da consulta abaixo:

    SELECT * from usu_tplandep
    INNER JOIN
                  (select * from USU_TPLANFUNC
                   WHERE (USU_NUMCAR = '' OR usu_numcar IS NULL)
                     AND EXISTS (SELECT 1
            FROM R034FUN F
            WHERE F.SITAFA IN (7)
            AND F.NUMEMP = USU_NUMEMP
            AND F.TIPCOL = USU_TIPCOL
            AND F.NUMCAD = USU_NUMCAD)) PlanFunc
    on usu_tplandep.usu_numemp = PlanFunc.usu_numemp and
       usu_tplandep.usu_tipcol = PlanFunc.usu_tipcol and  
       usu_tplandep.usu_numcad = PlanFunc.usu_numcad and
       usu_tplandep.usu_codpla = PlanFunc.usu_codpla and
       usu_tplandep.usu_datinc = PlanFunc.usu_datinc

    Já tentei delete diretamente, criar uma CTE e deletar a partir da CTE mas nada dar certo.

    O que eu poderia fazer nessa situação ?

    segunda-feira, 1 de outubro de 2012 14:18

Respostas

  • DELETE A 
    FROM  usu_tplandep as A 
    INNER JOIN 
                  (select * from USU_TPLANFUNC
                   WHERE (USU_NUMCAR = '' OR usu_numcar IS NULL)
                     AND EXISTS (SELECT 1
            FROM R034FUN F
            WHERE F.SITAFA IN (7)
            AND F.NUMEMP = USU_NUMEMP
            AND F.TIPCOL = USU_TIPCOL
            AND F.NUMCAD = USU_NUMCAD)) PlanFunc
    on A.usu_numemp = PlanFunc.usu_numemp and
       A.usu_tipcol = PlanFunc.usu_tipcol and   
       A.usu_numcad = PlanFunc.usu_numcad and
       A.usu_codpla = PlanFunc.usu_codpla and
       A.usu_datinc = PlanFunc.usu_datinc

    tente dessa forma, mais só execute se realmente ter certeza do q for deletar.

    obs. utilize begin tran e commit tran


    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino

    segunda-feira, 1 de outubro de 2012 14:29

Todas as Respostas

  • Rapapell,

    Você poderia armazenar este resultado em uma outra tabela e através do operador Exists fazer uso no comando delete.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    segunda-feira, 1 de outubro de 2012 14:22
  • DELETE A 
    FROM  usu_tplandep as A 
    INNER JOIN 
                  (select * from USU_TPLANFUNC
                   WHERE (USU_NUMCAR = '' OR usu_numcar IS NULL)
                     AND EXISTS (SELECT 1
            FROM R034FUN F
            WHERE F.SITAFA IN (7)
            AND F.NUMEMP = USU_NUMEMP
            AND F.TIPCOL = USU_TIPCOL
            AND F.NUMCAD = USU_NUMCAD)) PlanFunc
    on A.usu_numemp = PlanFunc.usu_numemp and
       A.usu_tipcol = PlanFunc.usu_tipcol and   
       A.usu_numcad = PlanFunc.usu_numcad and
       A.usu_codpla = PlanFunc.usu_codpla and
       A.usu_datinc = PlanFunc.usu_datinc

    tente dessa forma, mais só execute se realmente ter certeza do q for deletar.

    obs. utilize begin tran e commit tran


    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino

    segunda-feira, 1 de outubro de 2012 14:29
  • Leonardo,

    Concordo com a sua sugestão, mas tenho receios, justamente por poder sem querer executar uma ação errado e excluir dados desnecessários.

    A sugestão do begin tran e commit tran, já cria esta proteção.

    Mas por isso eu indiquei armazenar os dados em uma tabela temporário e depois fazer uma comparação.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    segunda-feira, 1 de outubro de 2012 14:35
  • Penso que criar uma tabela temporária, como o Junior indicou, é válido para você primeiro garantir que suas junções e condições estão corretas.

    Mas, depois de garantir isso, a deleção direta indicada pelo Leonardo já estaria de bom tom.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    segunda-feira, 1 de outubro de 2012 14:39
    Moderador
  • Ai neste caso eu utilizaria o Insert Into na tabela temporária... certo Júnior ?

    segunda-feira, 1 de outubro de 2012 16:00
  • Perfeito Leonardo.

    Este script ficará dentro de um JOB, então praticamente não haverá riscos de exclusões erradas.

    Muito obrigado.

    segunda-feira, 1 de outubro de 2012 16:25
  • Rapapell,

    Isso mesmo.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    segunda-feira, 1 de outubro de 2012 16:42