none
Update baseado em um select RRS feed

  • Pergunta

  •  

    Boa Tarde!!!

     

    Gostaria de executar um update baseado em um select, porém o Sql Server da um erro dizendo que estou querendo fazer essa execução em mais de uma linha, aguém pode me ajudar?

     

     

    Grato

     

    Mauricio

    terça-feira, 2 de dezembro de 2008 18:24

Respostas

  • Correção do código:

    Code Snippet

    update teste
    set media_direita = b.valor
    from teste a,(select objectid,((num_inic + num_fim)/2) as valor from teste) b
    where a.objectid=b.objectid

     

    terça-feira, 2 de dezembro de 2008 20:28
  • Boa Tarde,

     

    Se é a mesma tabela, acho que o código poderia ser bem mais simples

     

    Code Snippet

    update teste

    set media_direita = (num_inic + num_fim) / 2.0

     

    Esse código funcionará se objectid for um campo exclusivo, ou seja, sem repetições, se ele tiver repetições, então nenhuma das consultas funcionará. Outros detalhes terão que ser melhor explanados.

     

    [ ]s,

     

    Gustavo

    terça-feira, 2 de dezembro de 2008 20:51

Todas as Respostas

  • Olá Mauriboy,

    vc está usando um "=" ao invés de "in" ou "exists", na hora de comparar registros do update com o select?

     

    Acho que vc deve usar algo como o "in", pois ele compara a existencia de valores retornado pelo seu select, muito provavelmente o teu select retorna mais de um valor e como a condição tem que ser "=" ele dá erro, pois o SQL não vai com parar o um valor do código do update uasndo "=" com a saída do select que são várias possibilidades. Mas se vc usar um "in" ou "exists" isso é possível.

     

    Qualquer coisa posta o código, fica melhor pra entender.

    terça-feira, 2 de dezembro de 2008 18:28
  • Boa Tarde,

     

    Esse tipo de requisição pode acontecer quando se usa o UPDATE para atualizar campos de uma tabela baseando-se em outra tabela. Se essa é a necessidade, o código abaixo pode ser bem útil.

     

    Code Snippet

    UPDATE T1 SET CampoT1 = T2.CampoT2

    FROM T1

    INNER JOIN T2 ON T1.Chave = T2.Chave

     

    Se essa não for a necessidade, você poderia postar o código e descrevê-la ?

     

    [ ]s,

     

    Gustavo

     

    terça-feira, 2 de dezembro de 2008 18:46
  • Mauriboy,

     

    Como você montou este código?

    terça-feira, 2 de dezembro de 2008 18:50
  • Concordo junior, se ele postar o código fica mais fácil pra ajudar.

    terça-feira, 2 de dezembro de 2008 18:52
  •  

     

     

    Boa Tarde!!!

     

    Demorei um pouco, mas o código ta aqui.

     

     

    update teste

    set media_direita = (select (num_inic + num_fim)/2 from teste)

    where objectid=objectid

     

     

    o erro é o seguinte:

     

    Msg 512, Level 16, State 1, Line 1

    Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

    The statement has been terminated.

     

    Com in

     

    update teste

    set media_direita in (select (num_inic + num_fim)/2 from teste)

    where objectid=objectid

     

     

    erro:

     

    Msg 156, Level 15, State 1, Line 2

    Incorrect syntax near the keyword 'in'.

    Msg 156, Level 15, State 1, Line 3

    Incorrect syntax near the keyword 'where'.

     

     

    Se alguem puder me explicar isso ficarei muito grato.

     

     

    O objetivo da query é retornar a média de dois campos numéricos populando um campo novo chamado média, tudo isso atrravés de um update, ao invés de criar uma tabela temporária com o objectid, achei melhor fazer um update com select, pois a tabela tem muitas linhas.

     

     

    Maurício

    terça-feira, 2 de dezembro de 2008 20:07
  • Avalie a seguinte instrução:

     

    Code Snippet

    update teste
    set media_direita = b.valor
    from teste a,(select ((num_inic + num_fim)/2) as valor from teste) b
    where a.objectid=b.objectid

     

     


     

    terça-feira, 2 de dezembro de 2008 20:16
  • Correção do código:

    Code Snippet

    update teste
    set media_direita = b.valor
    from teste a,(select objectid,((num_inic + num_fim)/2) as valor from teste) b
    where a.objectid=b.objectid

     

    terça-feira, 2 de dezembro de 2008 20:28
  • Mauriboy, vc conseguiu?

    terça-feira, 2 de dezembro de 2008 20:49
  • Boa Tarde,

     

    Se é a mesma tabela, acho que o código poderia ser bem mais simples

     

    Code Snippet

    update teste

    set media_direita = (num_inic + num_fim) / 2.0

     

    Esse código funcionará se objectid for um campo exclusivo, ou seja, sem repetições, se ele tiver repetições, então nenhuma das consultas funcionará. Outros detalhes terão que ser melhor explanados.

     

    [ ]s,

     

    Gustavo

    terça-feira, 2 de dezembro de 2008 20:51
  •  

     

     

    Sensacional!!!, A resposta sua e a do Gustavo sanaram minha dúvida, de fato o select é na mesma tabela, mas se eu quiser de outra tabela, tenho ai a resposta do Emanuel, agora tenho Scripts para as duas situações!!!

     

    Muito Obrigado

     

    Maurício

    quarta-feira, 3 de dezembro de 2008 11:31
  • Oi Mauriboy, fico feliz por ter ajudado, a observação do Gustavo é básica, muito bem observado. Eu nem tinha observado essa questão por focar no teu script, ou seja, fiz só o ajuste seguindo a sua linha de raciocínio que era pra vc tentar entender o script que vc estava fazendo.

     

    Mauriboy, se possível classifique as respostas.

    Precisando estamos aqui.

     

    Valeu!

     

    quarta-feira, 3 de dezembro de 2008 12:03
  • Olá Maumauboy tudo bem?

    ví que vc consegui resolver através da ajuda dos participantes do forum.

     

    Gostaria de lhe pedir que se possível, classifique as respostas que lhe ajudaram.

    Valeu!

    segunda-feira, 8 de dezembro de 2008 17:20
  • Boa Tarde,

     

    Essa dúvida havia sido classificada como respondida anteriormente.

    Como o Maumauboy não se manifestou eu as remarquei como corretas já que segundo o seu último post, as mesmas o atendem.

     

    [ ]s,

     

    Gustavo

     

    segunda-feira, 8 de dezembro de 2008 17:57