1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

SQL master

Discussão em 'Programação' iniciada por MARSHALL, 7 de Agosto de 2008. (Respostas: 16; Visualizações: 1196)

  1. MARSHALL

    MARSHALL Power Member

    Boa tarde.

    Tenho uma tabela com varias colunas, duas dessas colunas é família e categoria.

    O que aconteceu é que os utilizadores por vezes trocaram a inserção, inserindo família na categoria e vice-versa.

    O que eu quero é correr uma rotina por exemplo, por engano inseriram na categoria POPROCK e na Família CD, deveria ter sido ao contrario, então quero fazer uma pesquisa na categoria por POPROCK, cada registo que encontre troca POPROCK para família e CD para Categoria.

    Claro que a busca vai ser dinâmica porque do outro lado em vez de cd pode estar dvd tem que ser no geral.

    Mas basicamente me digam o comando, não pode acontecer ele copia família para categoria e quando vou buscar a categoria essa agora já esta actualizada e vai buscar a mesma coisa, não sei se preciso variável temporária ou se a um comando próprio para isso.

    Queria executar o comando SQL na Microsoft SQL Server Management Studio.

    Cumprimentos[[]]
     
    Última edição pelo moderador: 7 de Agosto de 2008
  2. BigPT

    BigPT Power Member

    E não consegues fazer isso com um comando update?

    update nometabela
    set categoria = coluna, coluna=categoria
    where categoria = 'POPROCK'
     
  3. MARSHALL

    MARSHALL Power Member

    Boas.

    Estava a pensar era do genero que set categoria=familia familia=categoria, como esta primeiro a categoria=familia quando for buscar familia=categoria ele ja não tem o novo valor.

    Cumps[]
     
  4. BigPT

    BigPT Power Member

    Ele faz set com o valor antigo de cada coluna, a ordem não interessa.
     
  5. MARSHALL

    MARSHALL Power Member

    Boas.

    Obrigado era isso que precissava saber.

    Abraços.
     
  6. Boas,

    Também podes passar os dados da tua tabela actual, por forma a teres um tabela pivo para efectuares as trocas.

    Por exemplo imagina que a tabela se chamava artigos: select * from artigos into x_artigos

    -A a intrução a cima cria-te uma tabela com nome x_artigos com os mesmo dados e estrotura da tabela artigos.

    Depois podias fazer updates cruzados por exemplo:

    update a set
    a.familia=b.categoria,
    a.categoria=b.familia
    from artigos a
    join x_artigos b on a.chave=b.chave
    where a.familia='CD'

    No final podias sempre apagar a tabela pivo com drop tabela x_artigos (Por favor não troques o nome nesta instrução ;) )

    Espero ter sido util
    LoboMau
     
  7. MARSHALL

    MARSHALL Power Member

    Boas.

    Esta ai uma boa solução porque a anterior não resultou, pois ao actualizar o primeiro campo o segundo ia ficar com o novo valor.

    Procura algo que não fosse necessario fazer um select e nova tabela, mas a tua solução parece-me boa.

    Cumps[[]]
     
  8. BigPT

    BigPT Power Member

    Já agora chegaste a experimentar a solução que sugeri?
     
  9. Boas novamente,

    Atenção que a solução apresentada pelo colega BigPT não esta erada de forma alguma, só que há que ter em atenção em instruir o SQL para fazer exactamente o pretendido ou seja:

    Se fez:
    update familia=categoria where familia='cd'
    update categoria=familia where familia='cd'

    O SQL esta a processa instruções separadas. Para se fazer a inversão tem que ser indicado na mesma instrução
    Ex: update artigos set familia=categoria, categoria=familia where familia='cd'

    Com esta instrução unica o motor SQL consegues perceber que o pretendido é inverter os campos.

    Contudo e por precaução eu costumo sempre utilizar uma tabela temporária, podemos nos enganar, etc. Com a tabela temporaria podemos sempre guardar os dados uns dias e voltar a traz sem ter que repor um backup completo da base de dados.

    Cmps,
    LoboMau
     
  10. MARSHALL

    MARSHALL Power Member

    Mas com esta o que aconteceu foi.
    Imagina familia era Pop-rock e categoria era cd.
    Familia fica depois da instrução cd e a categoria não ficou Pop-rock assumiu cd, faz tudo em tempo real e vai buscar o valor do campo familia ja apos ser actualizado.

    Cumps[[]]
     
  11. Boas,

    Ok, mas qual a ou as instruções que executas-tes para obteres esse resultado.

    Olha que assim: update artigos set familia=categoria, categoria=familia where familia='cd' funciona.

    Cmps,
    LoboMau
     
  12. BigPT

    BigPT Power Member

    Para mim funciona mas eu trabalho é com Oracle :P
     
  13. MARSHALL

    MARSHALL Power Member

    Boas.

    A tabela que quero colocar direita é sql server é do PHC.
    Mas fiz o teste com a tabela do site essa é mysql.

    Cumps[[]]
     
  14. Boas,

    Pois, eu garanto a intrução (update artigos set familia=categoria, categoria=familia where familia='cd') em SQL Server, em mySQL não conheço o funcionamento desse motor a 100%

    Se fosse eu por segurança fazia com a tabela temporaria.

    Mas podes fazer no SQL que funciona, o SQL/PHC eu sei do que se trata ;) update st set familia..... ;)
    Cmps
    LoboMau
     
    Última edição: 8 de Agosto de 2008
  15. MARSHALL

    MARSHALL Power Member

    Boas.

    De qualquer maneira vou usar a tabela temporaria.
    Mas só segunda.

    Bom fim-de-semana para voces

    Cumps[[]]
     
  16. BigPT

    BigPT Power Member

    Não há maneira de impedir que aconteça essa troca de dados?
     
  17. optimusSupremo

    optimusSupremo Power Member

    Usa um cursor...
    percorres linha a linha, guardas os valores para uma variável e depois fazes um update para essa linha.

    Também podes escolher um caractér e concatenas tudo na numa das colunas separada por esse caractér.
    depois fazes um update em que separas um para um lado e o outro para o outro.
     

Partilhar esta Página