ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

pegar dados de outra tabela via sql

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
Roberto_Karen
Novato
Novato


Registrado: Sexta-Feira, 14 de Setembro de 2007
Mensagens: 61

MensagemEnviada: Ter Fev 02, 2016 11:46 pm    Assunto: pegar dados de outra tabela via sql Responder com Citação

Ola pessoal tenho duas tabelas distintas com chave igual

na tabela A quero buscar a informação de um determinado campo da tabela B quando o campo chave for igual e dar um update na tabela A

USO O COMANDO ABAIXO mas é muito demorado haja visto que minha tabela destino tem 250 mil registro

Dm.IB_PROVISAO.SQL.Clear;
DM.IB_PROVISAO.SQL.Add('UPDATE BASE_UNICA_1 SET LETRA_AD =(SELECT distinct AD.AD_LETRA FROM AD WHERE AD.CONTA = BASE_UNICA_1.CONTA) WHERE EXISTS ( SELECT BASE_UNICA_1.CONTA FROM AD WHERE AD.CONTA = BASE_UNICA_1.CONTA)');
DM.IB_PROVISAO.ExecSQL;

algum comando diferente que faça o processo ?

grato
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 9098
Localização: Sinop-MT

MensagemEnviada: Qua Fev 03, 2016 7:42 am    Assunto: Responder com Citação

qual BD vc ta usando?

se for FB:

Código:
UPDATE base_unica_1
   SET letra_AD = (SELECT FIRST ad.ad_letra
         FROM ad
         WHERE ad.conta = base_unica_1.conta)


se for MySQL:
Código:
UPDATE base_unica_1
   SET letra_AD = (SELECT ad.ad_letra
         FROM ad
         WHERE ad.conta = base_unica_1.conta LIMIT 1)


o campo ad.conta deve possuir indice pra melhorar a velocidade
_________________
<b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Roberto_Karen
Novato
Novato


Registrado: Sexta-Feira, 14 de Setembro de 2007
Mensagens: 61

MensagemEnviada: Qua Fev 03, 2016 10:31 am    Assunto: Responder com Citação

joemil escreveu:
qual BD vc ta usando?

se for FB:

Código:
UPDATE base_unica_1
   SET letra_AD = (SELECT FIRST ad.ad_letra
         FROM ad
         WHERE ad.conta = base_unica_1.conta)


se for MySQL:
Código:
UPDATE base_unica_1
   SET letra_AD = (SELECT ad.ad_letra
         FROM ad
         WHERE ad.conta = base_unica_1.conta LIMIT 1)


o campo ad.conta deve possuir indice pra melhorar a velocidade


Uso o fB
so tem um problema a tabela a ser atualizada tem mais de um registro igual a TABELA AD
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qua Fev 03, 2016 10:58 am    Assunto: Responder com Citação

Boa tarde,

Qual valor (de qual registro) deve ser utilizado no Update quando existir mais de um registro na tabela AD para a mesma conta?


Editado pela última vez por imex em Qui Set 28, 2023 11:58 am, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Roberto_Karen
Novato
Novato


Registrado: Sexta-Feira, 14 de Setembro de 2007
Mensagens: 61

MensagemEnviada: Qua Fev 03, 2016 11:28 am    Assunto: Responder com Citação

imex escreveu:
Boa tarde,

Qual valor (de qual registro) deve ser utilizado no Update quando existir mais de um registro na tabela AD para a mesma conta?


Acho que não me fiz entender

na tabela BASE_UNICA TENHO

CONTA LETRA
REG 1 07038-6
REG 2 07038-6


NA TABELA AD TENHO

CONTA LETRA
REG 1 07038-6 B


QUERO QUE A LETRA REF A CONTA DA TAB AD SEJA ATUALIZADA EM TODAS AS LINHAS DA TABELA BASE_UNICA QUANDO AS CONTAS FOREM IGUAIS

FICANDO ASSIM

CONTA LETRA
REG 1 07038-6 B
REG 2 07038-6 B

pelo metodo acima ate consigo mas demora muito devido ao grande numero de registro tanta da tabela BASE_UNICA (250000 reg) como da tabela AD (120000 reg)
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qua Fev 03, 2016 1:18 pm    Assunto: Responder com Citação

Experimente fazer testes com o comando Merge para ver se é obtido um desempenho melhor:

Código:
merge into BASE_UNICA_1
    using AD
    on AD.CONTA = BASE_UNICA_1.CONTA
    when matched then
        UPDATE SET LETRA_AD = AD.AD_LETRA


Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Roberto_Karen
Novato
Novato


Registrado: Sexta-Feira, 14 de Setembro de 2007
Mensagens: 61

MensagemEnviada: Qua Fev 03, 2016 2:09 pm    Assunto: Responder com Citação

imex escreveu:
Experimente fazer testes com o comando Merge para ver se é obtido um desempenho melhor:

Código:
merge into BASE_UNICA_1
    using AD
    on AD.CONTA = BASE_UNICA_1.CONTA
    when matched then
        UPDATE SET LETRA_AD = AD.AD_LETRA


Espero que ajude



Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, char 1.
merge.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qua Fev 03, 2016 2:35 pm    Assunto: Responder com Citação

Qual versão do Firebird você está utilizando?
O comando Merge foi adicionado a partir da versão 2.1.

Existe algum índice na tabela AD com o campo Conta?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Roberto_Karen
Novato
Novato


Registrado: Sexta-Feira, 14 de Setembro de 2007
Mensagens: 61

MensagemEnviada: Qua Fev 03, 2016 2:48 pm    Assunto: Responder com Citação

imex escreveu:
Qual versão do Firebird você está utilizando?
O comando Merge foi adicionado a partir da versão 2.1.

Existe algum índice na tabela AD com o campo Conta?


ENTENDI ESTOU USANDO O 1.5 quanto ao indece não tem
também não sei como criar em modo execução

vou instalar a versao 2.1 para ver se resolve


Meu Amigo instalei o firebird 2.5 e ficou show, deu certinho você ao sabe como me ajudou atualiza a base de 250000 em 20 10 segundo

muito obrigado pela ajuda,

sucesso !
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Roberto_Karen
Novato
Novato


Registrado: Sexta-Feira, 14 de Setembro de 2007
Mensagens: 61

MensagemEnviada: Qui Fev 04, 2016 7:08 pm    Assunto: Responder com Citação

Roberto_Karen escreveu:
imex escreveu:
Qual versão do Firebird você está utilizando?
O comando Merge foi adicionado a partir da versão 2.1.

Existe algum índice na tabela AD com o campo Conta?


ENTENDI ESTOU USANDO O 1.5 quanto ao indece não tem
também não sei como criar em modo execução

vou instalar a versao 2.1 para ver se resolve


Meu Amigo instalei o firebird 2.5 e ficou show, deu certinho você ao sabe como me ajudou atualiza a base de 250000 em 20 10 segundo

muito obrigado pela ajuda,

sucesso !



Amigo desculpe o incomodo

estava tudo certo de repente começo aparecer este erro ,

invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, column 0.
merge.

ja procurei na internet e nao consegui identificar o erro

Dm.QueryMaster.SQL.Clear;
DM.QueryMaster.SQL.Add('merge into BASE_UN_2 using TB_ADTO on TB_ADTO.CONTA = BASE_UN_2.CONTA when matched then UPDATE SET LETRA_AD = TB_ADTO.AD_LETRA ');
DM.QueryMaster.ExecSQL;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Sex Fev 05, 2016 8:52 am    Assunto: Responder com Citação

Pela mensagem de erro, acredito que o comando Merge não está sendo reconhecido.
Acho que isso pode estar ocorrendo se você estiver utilizando uma versão antiga da dll cliente do Firebird (fbclient.dll ou gds32.dll, depende do componente de conexão utilizado), sendo que acho que essa dll deve de preferência ficar na mesma pasta que o seu executável.

Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Roberto_Karen
Novato
Novato


Registrado: Sexta-Feira, 14 de Setembro de 2007
Mensagens: 61

MensagemEnviada: Sex Fev 24, 2017 1:52 pm    Assunto: Responder com Citação

imex escreveu:
Pela mensagem de erro, acredito que o comando Merge não está sendo reconhecido.
Acho que isso pode estar ocorrendo se você estiver utilizando uma versão antiga da dll cliente do Firebird (fbclient.dll ou gds32.dll, depende do componente de conexão utilizado), sendo que acho que essa dll deve de preferência ficar na mesma pasta que o seu executável.

Espero que ajude



Olá tive que voltar aqui para tirar uma dúvida,
o comando merge com banco firebird 2.5 alocado no servidor server 2012 processa muito rápido, mas quando o banco esta alocado em um servidor Linux fica muito lento tem alguma coisa haver se sim tem como resolver ?

Grato!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB