SQL master

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:
E não consegues fazer isso com um comando update?

update nometabela
set categoria = coluna, coluna=categoria
where categoria = 'POPROCK'
 
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[]
 
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[]

Ele faz set com o valor antigo de cada coluna, a ordem não interessa.
 
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
 
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[[]]
 
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[[]]

Já agora chegaste a experimentar a solução que sugeri?
 
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
 
Boas novamente,

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.


Cmps,
LoboMau

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[[]]
 
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
 
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:
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.
 
Back
Topo