View Full Version : SQL master
MARSHALL 07-08-2008, 18:16 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[[]]
E não consegues fazer isso com um comando update?
update nometabela
set categoria = coluna, coluna=categoria
where categoria = 'POPROCK'
MARSHALL 08-08-2008, 12:23 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.
MARSHALL 08-08-2008, 13:56 Boas.
Obrigado era isso que precissava saber.
Abraços.
VLoboMau 08-08-2008, 14:05 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
MARSHALL 08-08-2008, 15:06 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?
VLoboMau 08-08-2008, 15:49 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
MARSHALL 08-08-2008, 17:15 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[[]]
VLoboMau 08-08-2008, 17:22 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,
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
Para mim funciona mas eu trabalho é com Oracle :P
MARSHALL 08-08-2008, 18:08 Boas.
A tabela que quero colocar direita é sql server é do PHC.
Mas fiz o teste com a tabela do site essa é mysql.
Cumps[[]]
VLoboMau 08-08-2008, 18:43 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
MARSHALL 08-08-2008, 19:58 Boas.
De qualquer maneira vou usar a tabela temporaria.
Mas só segunda.
Bom fim-de-semana para voces
Cumps[[]]
Boas.
De qualquer maneira vou usar a tabela temporaria.
Mas só segunda.
Bom fim-de-semana para voces
Cumps[[]]
Não há maneira de impedir que aconteça essa troca de dados?
optimusSupremo 09-08-2008, 00:01 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.
|
|