none
Insert de uma consulta com variaveis ou cursor RRS feed

  • 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? 

    terça-feira, 26 de junho de 2012 14:14

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.codigoUser

    Se 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
    terça-feira, 26 de junho de 2012 14:45

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_usuario


    Abraços, Weslley Moura MCP - MCTS - ORA SqlExpert

    • Sugerido como Resposta Weslley Moura terça-feira, 26 de junho de 2012 14:46
    terça-feira, 26 de junho de 2012 14:36
  • Então eu posso dar select dentro do set? não sabia disso, legal!!!
    terça-feira, 26 de junho de 2012 14:42
  • 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.codigoUser

    Se 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
    terça-feira, 26 de junho de 2012 14:45
  • 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

    Mas nesse caso ele não vai atualizar todos os cadastros da tabela usuario com o numero mais alto da cartao, ou vai fazer isso relacionando com o usuário, pois pode haver vários cartões, mas só um usuario.
    terça-feira, 26 de junho de 2012 14:57
  • 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

    terça-feira, 26 de junho de 2012 15:01
  • 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?

    terça-feira, 26 de junho de 2012 15:55
  • Disponha.

    Então o exemplo que eu te passei está correto. Pode usá-lo que vai funcionar como você deseja.


    Abraços, Weslley Moura MCP - MCTS - ORA SqlExpert

    terça-feira, 26 de junho de 2012 16:45
  • Hum, ok, muito obrigado.
    terça-feira, 26 de junho de 2012 16:47