2009-04-07 7 views
7

tengo los siguientes datos:¿Cómo puedo actualizar una tabla con datos recuperados por un join en sí mismo?

SectorKey Sector foo 
1   A  null 
2   B  null 
...  ... ... 
1   null a 
2   null b 
2   null c 
1   null d 
2   null e 
...  ... ... 

Quiero actualizar Sector columna cuando se basa nulo en el valor de sectorKey, es decir, quiero sector sea 'A' cuando SectorKey es 1 y 'B' cuando SectorKey es de 2

he tratado de esta consulta:

update tbFoo 
set Sector=A.sector 
from tbFoo A INNER JOIN tbFoo B 
ON A.SectorKey=B.SectorKey 
and A.Sector is not null 
and B.Sector is null 

y tengo este mensaje de error:

La tabla 'tbFoo' es ambigua.

He intentado alias el primer tbFoo, pero no parece ser una sintaxis válida. No entiendo por qué SQLServer se queja de un nombramiento ambiguo ya que tengo todas mis tablas con alias.

He encontrado this thread, y siento que estoy haciendo exactamente lo mismo que en la respuesta aludida. También he probado la consulta se sugiere en la respuesta aceptada:

update tbFoo A 
    set Sector = 
     (select Sector from tbFoo 
     where A.SectorKey=SectorKey and Sector is not null) 

y luego SQLServer queja por una sintaxis incorrecta cerca de 'A'

¿Alguna idea de lo que puede estar ocurriendo, y para solucionar esto? Estoy usando SQLServer 2008.

EDIT No he mostrado los datos totales de mi tabla. No tengo solo dos casos (A y B), sino algunos miles de casos. Lo que un caso explícita no es una opción

Respuesta

22

utiliza el alias en la primera parte de su consulta de actualización:

update B 
set Sector=A.sector 
from tbFoo A INNER JOIN tbFoo B 
ON A.SectorKey=B.SectorKey 
and A.Sector is not null 
and B.Sector is null 

De lo contrario, no se sabe qué instancia de la tabla para actualizar

+0

@ Joel. Exactamente lo que me estaba perdiendo. gracias :) – Brann

+0

Parece que no puedo pasar la posición de su FROM, siempre arroja un error allí, ¿hay un modo mysql que no acepte un FROM después de un conjunto? – Gisheri

+1

@Gisheri Estás usando MySql. Esta pregunta está etiquetada para Servidor SQL. La sintaxis para MySql y Sql Server son diferentes en esta área. MySql no sigue el estándar ansi aquí. –

0
update 
    tbFoo 
set 
    Sector = (select tf.Sector from tbFoo tf where 
       tbFoo.SectorKey = tf.SectorKey and 
       tf.Sector is not null) 

En caso de trabajar

1

intenta utilizar un CTE y cambiar el nombre del campo de alias:

WITH CTE_TBFOO(SETOR) 
AS 
( 
    SELECT Sector 
    FROM tbFoo T1 
) 
update tbFoo 
set Sector= A.SETOR 
from CTE_TBFOO A 
WHERE A.SETOR = SectorKey 
and A.SETOR is not null 
and B.Sector is null 
Cuestiones relacionadas