Como montar um UpDate baseado na pesquisa entre duas tabelas

Firebird

25/10/2013

Olá, mais um pedido de socorro!!!

Tenho no BD Firebird 4 tabelas: TB_Estado, TB_Cidade, TB_Bairro, TB_Endereco
o bicho papão é: criei e adicionei dados para essas tabelas atravéz de scripts até aqui tudo beleza
sendo: TB_Estado 27 registros TB_Cidade 9.920 registros TB_Bairro 56.016 registros TB_Endereco 849.344 registros
quando tentei criar relacionamento entre as tabelas pelos campos ID foi que percebi que na TB_Endereco existe alguns endereços que ID da cidade não existe
Ai então na TB_Endereco criei um novo campo FLEG_DELETE varchar(1)
preciso fazer um UPDATE percorendo todos os registros da TB_Endereco e gravando no campo FLEG_DELETE = 'S' se caso END_CIDADE_ID <> CIDADE_ID

Campos da TB_CIDADE
Cidade_ID integer (PK)
Cidade_UF_ID integer (FK)
Cidade_CEP_GERAL varchar(8)
Cidade_DESCRICAO varchar(35)

Campos da TB_ENDERECO
Endereco_Bairro_ID interger (FK)
Endereco_Cidade_ID integer (FK)
Endereco_CEP varchar(8)
Endereco_Logradouro varchar(150)
Endereco_Complemento varchar(50)
FLEG_DELETE varchar(1)

como montar um um UpDate para gravar na TB_Endereco no campo FLEG_DELETE = ''S' se Endereco_Cidade_ID <> Cidade_ID
desculpe os blablas é q estou tentando deixar mais claro possivel o entendimento
Everaldo Torres

Everaldo Torres

Curtidas 0

Respostas

Alex Lekao

Alex Lekao

25/10/2013

Ola Everaldo Bom dia!!!

Tente assim vamos ver se da certo, faca um backup antes e tal... rsrsr

update e
   set e.fleg_delete = 'S'
from tb_endereco e,  tb_cidade c
where e.Endereco_Cidade_ID <> c.Cidade_ID
   and (e.endereco_cidadde_id is null or e.endereco_cidade_id = '')


veja se da certo e posta ai o resultado.

Talvez seja interessante verificar o script que esta usando para retornar os resultados pq possa estar precisando de algum ajuste que corrija se o problema estiver com as junções ou relacionamentos.

Espero ter ajudado.

Abraco.

Alex - Lekao
GOSTEI 0
Thiago Irrazabal

Thiago Irrazabal

25/10/2013

Boa noite, outra maneira de fazer isso poderia ser criando uma procedure.

SET TERM ^ ;

CREATE PROCEDURE SP_ATUALIZA_FLAG
AS
DECLARE VARIABLE ENDERECO_CIDADE_ID INTEGER;
BEGIN
  FOR SELECT A.ENDERECO_CIDADE_ID FROM TB_ENDERECO A
      INNER JOIN TB_CIDADE B ON B.CIDADE_ID <> A.ENDERECO_CIDADE_ID
  INTO :ENDERECO_CIDADE_ID DO
    BEGIN
      UPDATE TB_ENDERECO
      SET FLEG_DELETE = 'S'
      WHERE ENDERECO_CIDADE_ID = :ENDERECO_CIDADE_ID;
    END
  SUSPEND;
END^

SET TERM ; ^

GRANT SELECT,UPDATE ON TB_ENDERECO TO PROCEDURE SP_ATUALIZA_FLAG;

GRANT SELECT ON TB_CIDADE TO PROCEDURE SP_ATUALIZA_FLAG;

GRANT EXECUTE ON PROCEDURE SP_ATUALIZA_FLAG TO "PUBLIC";
GRANT EXECUTE ON PROCEDURE SP_ATUALIZA_FLAG TO SYSDBA;


Espero ter ajudado.


Att,
Thiago Irrazabal de Oliveira.
GOSTEI 0
Everaldo Torres

Everaldo Torres

25/10/2013

Muito Obrigado, funcionou, as dicas foram o suficiente para testar e validar a operação,
GOSTEI 0
Everaldo Torres

Everaldo Torres

25/10/2013

ficou show de bola, valeu amigos
GOSTEI 0
POSTAR