Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

brunosk2

Update em tabela por partes

Recommended Posts

Olá,

tenho duas tabelas: Associados e Especialidades

 

Table Associados Table Especialidades

crm crm

especialidade_1 especialidade

especialidade_2

especialidade_3

 

Tenho que percorrer a tabela Especialidades e em cada registro pego o crm, ai tenho que percorrer a tabela Associados procurando pelo mesmo crm, se especialidade_1 estiver vazio, eu faço um update com o que eu peguei na coluna especialidades da tabela Especialidades, se não estiver vazio eu checo se o especialidade_2 está vazio e o mesmo no especialidade_3.

 

Até ai tudo OK. O problema é que tenho que fazer isso "aos pedaços", cada tabelas tem milhares de registros, e quando eu tentei fazer de uma vez só deu erro de timeout, e não posso mexer nas configurações do servidor, tenho que fazer aos poucos mesmo. Mas como eu diferencio os registros que já passei dos que ainda não passei?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma tabela (que será temporária)

 

TEMP_ESPEIALIDADES

-------------------------------

CRM (PK)

Após atualizar um CRM insira nesta tabela, antes de iniciar uma alteração teste se não existe registro nesta tabela.

 

Após o fim do processo, DROPe a tabela.

 

Pretende fazer isto via PROCEDURE ou Aplicação , não ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema é que na tabela especialidades existem CRM's duplicados que acontece se o usuario tiver mais de uma especialidade. Pelo que entendi do que você disse, quando eu atualizo a especialidade eu faço um insert na tabela temporaria, mas ai quando eu passar por um crm que ja tenha passado antes, ele ja vai existir na tabela temporario e não seria feito o update na coluna especialidade_2.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A chave na temporária passa a ser crm/especialidade o teste feito com ambas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como assim a chave passa a ser crm/especialidade? Não entendi como isso resolve o problema que eu coloquei no post acima...

Sou beginner em PHP.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Antes de tudo , explique mlhor , por favor , o fez quando disse

 

e quando eu tentei fazer de uma vez só deu erro de timeout,

 

, como tentou fazer isto ?

 

===================================================

 

Uma solução :

 

 

1) Crie uma tabela temporária

 

temp_crm_especialidades

---------------------------------

crm (pk)

especialidade (pk)

 

2) uma procedure que fará

 

select *

from especialidades a

where not exists (select null

from temp_crm_especialidades b

where b.crm = a.crm

and b.especialidade = a.especialidade)

 

com base neste select faça o update descrito inicialmente

após este update faça o insert deste crm e especialidade

na tabela temp_crm_especialidades, na próxima execução da rotina este par (crm/especialidade) não será selecionado

 

3) resta fazer uma regra para rodar

 

"aos pedaços"

 

Quanto a síntaxe não conheço PHP nem como se faz procedure para Sql Server , mas a lógica básica poderia ter a solução que te passei acima.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde,

 

Tenta este script, ele irá criar uma tabela e fazer update campo por campo, marcando a especialidade já gravada, depois o que sobrar é porque o CRM tem mais de 3 especialidades.

 


-- Tabela de trabalho
select crm, especialidade, ok = cast('' as char(1))
into temp_especialidades
from Especialidades

--Grava
update Associados
set especialidade_1 = espec
from ( select crm, min(especialidade) as espec
from temp_especialidades
where ok = '' ) as e
where e.crm = Associados.crm

--Marca
update temp_especialidades
set ok = 's'
from Associados
where Associados.crm = temp_especialidades.crm
and Associados.especialidade_1 = temp_especialidades.especialidade

--Grava
update Associados
set especialidade_2 = espec
from ( select crm, min(especialidade) as espec
from temp_especialidades
where ok = '' ) as e
where e.crm = Associados.crm

--Marca
update temp_especialidades
set ok = 's'
from Associados
where Associados.crm = temp_especialidades.crm
and Associados.especialidade_2 = temp_especialidades.especialidade

--Grava
update Associados
set especialidade_3 = espec
from ( select crm, min(especialidade) as espec
from temp_especialidades
where ok = '' ) as e
where e.crm = Associados.crm

--Marca
update temp_especialidades
set ok = 's'
from Associados
where Associados.crm = temp_especialidades.crm
and Associados.especialidade_3 = temp_especialidades.especialidade

-- sobras, se o mesmo crm tem mais de 3 especialidades
select crm, especialidade
from temp_especialidades
where ok = ''

Compartilhar este post


Link para o post
Compartilhar em outros sites

//Tabela A

Table Associados

crm ; especialidade_1;especialidade_2;especialidade_3

 

//Tabela B

Table Especialidades

crm; Especialidades

 

Solução usando banco experimental.(Verificando se especialidade está vazia em Table Especialidade)

//caso fosse nescessário,poderia fazer para todas as tabelas,repetindo
{
Table Especialidades;
   @subs;
   Especialidades;
   (""); //busca campos em branco
  (verificado);//campo em branco recebe este texto
    Especialidades;
 query=1;  //< index de campo que será apontado
 destino=1 //< index do banco que receberá "verificado"
}
{
Table Especialidades;
@algo;
(verificado);//vai busca todos os campo em branco que foi substituido
0;0;0;
query=0;
destino=0
}
{
Resultados;
@tabela;//tabela temporaria
0;0;0;0;
query=0;
destino=0
}
//escreve resultados na tabela temporaria
{
Resultados;
@datamemo;
(Table Especialidades.que);
0;0;0;
query=0;
destino=0
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.