Usuário com melhor resposta
Insert de uma consulta com variaveis ou cursor

Pergunta
-
Bom dia pessoal, sou um pouco amador no sql ainda, gostaria de fazer o seguinte:
Tabela usuário
codigo, nome, cartao
Tabela cartao
codigo(usuario),ultimocartao
Então, eu faço uma consulta para ver qual o maior cartão relacionado aquele usuário, até ai blz, o problema é que queria fazer um update na tabela "usuário" jogando o cartao de numero mais alto da tabela "cartao", um por um é facil fazer, mas quando tem vários cartões como é o caso ai pra mim complico, eu pensei em algo como jogar valor por valor em uma variável e dando update usando um laço, o que você me dizem?
Respostas
-
Pode sim. Apenas para seu conhecimento, segue mais duas formas de montar o update (usando a mesma estrutura de tabelas do meu exemplo):
--atualiza usando subselect no JOIN
update u
set u.cartao = ultimocartao
from tb_usuario u
join
(
select c.codigoUser,
MAX (c.ultimocartao) as ultimocartao
from tb_cartao c
group by c.codigoUser
) c
on u.codigoUser = c.codigoUser
--atualiza usando CTE
with CTE_Cartao as
(
select c.codigoUser,
MAX (c.ultimocartao) as ultimocartao
from tb_cartao c
group by c.codigoUser
)
update u
set u.cartao = ultimocartao
from tb_usuario u
join CTE_Cartao c
on u.codigoUser = c.codigoUserSe o post foi útil, marque como resposta para ajudar os amigos que têm a mesma dúvida.
Abraços, Weslley Moura MCP - MCTS - ORA SqlExpert
- Marcado como Resposta Jonas Tomazelli terça-feira, 26 de junho de 2012 16:46
Todas as Respostas
-
Segue um modelo:
--drop table tb_usuario
create table tb_usuario
(
codigoUser int not null primary key,
nome varchar(50),
cartao int
)
--drop table tb_cartao
create table tb_cartao
(
codigoUser int,
ultimocartao int
)
--insere dados de teste
insert into tb_usuario values (1, 'WESLLEY', NULL)
insert into tb_cartao values (1, 10)
insert into tb_cartao values (1, 11)
--atualiza
update u
set u.cartao = (select max(c.ultimocartao) from tb_cartao c where u.codigoUser = c.codigoUser)
from tb_usuario u
--teste
select * from tb_usuarioAbraços, Weslley Moura MCP - MCTS - ORA SqlExpert
- Sugerido como Resposta Weslley Moura terça-feira, 26 de junho de 2012 14:46
-
-
Pode sim. Apenas para seu conhecimento, segue mais duas formas de montar o update (usando a mesma estrutura de tabelas do meu exemplo):
--atualiza usando subselect no JOIN
update u
set u.cartao = ultimocartao
from tb_usuario u
join
(
select c.codigoUser,
MAX (c.ultimocartao) as ultimocartao
from tb_cartao c
group by c.codigoUser
) c
on u.codigoUser = c.codigoUser
--atualiza usando CTE
with CTE_Cartao as
(
select c.codigoUser,
MAX (c.ultimocartao) as ultimocartao
from tb_cartao c
group by c.codigoUser
)
update u
set u.cartao = ultimocartao
from tb_usuario u
join CTE_Cartao c
on u.codigoUser = c.codigoUserSe o post foi útil, marque como resposta para ajudar os amigos que têm a mesma dúvida.
Abraços, Weslley Moura MCP - MCTS - ORA SqlExpert
- Marcado como Resposta Jonas Tomazelli terça-feira, 26 de junho de 2012 16:46
-
Segue um modelo:
--drop table tb_usuario
create table tb_usuario
(
codigoUser int not null primary key,
nome varchar(50),
cartao int
)
--drop table tb_cartao
create table tb_cartao
(
codigoUser int,
ultimocartao int
)
--insere dados de teste
insert into tb_usuario values (1, 'WESLLEY', NULL)
insert into tb_cartao values (1, 10)
insert into tb_cartao values (1, 11)
--atualiza
update u
set u.cartao = (select max(c.ultimocartao) from tb_cartao c where u.codigoUser = c.codigoUser)
from tb_usuario u
--teste
select * from tb_usuario
Abraços, Weslley Moura MCP - MCTS - ORA SqlExpert
-
Fiz o exemplo prevendo que um usuário pode ter vários cartões.
Se a lógica for diferente basta adaptá-la.Se precisar de ajuda poste a definição das suas tabelas, alguns dados de exemplo e um exemplo que como o update deveria funcionar.
Abraços, Weslley Moura MCP - MCTS - ORA SqlExpert
-
Weslley, primeiro deixa eu te agradecer por estar me ajudando, agora vou te explicar melhor a situação:
Tabelas
usuario e emissaocartao
A usuário contem os cadastros de clientes, a emissao cartao guarda todos os cartões dos clientes, mas como cada cliente só tem um cartao, o ultimo cartão é que prevalesse, o que aconteceu aqui foi que deu um problema e vários cartões emitidos não foram atualizados na tabela cliente que contem o campo idcartao. Por exemplo: um cliente teve um cartao de numero 200, ele precisou fazer uma segunda via, o novo cartao sai com numero 251, o sistema atualiza na tabela usuário substituindo o numero 200 pelo 251. A estrutura das tabelas que nos interessa é a seguinte:
------------------------------------------------------
usuario
'idcartao' 'nome' 'codigocliente'
200 joao 150150
------------------------------------------------------
emissaocartao
'idcartao' 'codigocliente'
200 150150
251 150150
-------------------------------------------------------
preciso consultar a tabela emissaocartao e pegar o cartao de numero mais alto associado ao usuario e atualizar na tabela usuário. Fiz uma bíblia, mas deu pra entender?
-
-