2009-02-28 13 views
40

Quiero eliminar filas de una variable de tabla de SQL Server 2000/2005 en función de la presencia de otras filas en la misma tabla (eliminar todas las filas de 0 count si no cuenta 0 fila existe con la misma fecha). Aquí está un ejemplo simplificado que sólo debe eliminar la fila añade en primer lugar:Variables de tabla con un alias en una instrucción Delete From

declare @O table (
    Month datetime, 
    ACount int NULL 
) 

insert into @O values ('2009-01-01', 0) 
insert into @O values ('2009-01-01', 1) 
insert into @O values ('2008-01-01', 1) 
insert into @O values ('2007-01-01', 0) 

delete from @O o1 
where ACount = 0 
    and exists (select Month from @O o2 where o1.Month = o2.Month and o2.ACount > 0) 

El problema es que no puedo conseguir el servidor SQL para aceptar alias o1 de la variable de tabla (y creo que se requiere un alias, debido a la "o1.Month = o2.Month" nombres de campos coincidentes). El error es:

Msg 102, nivel 15, estado 1, línea 11

sintaxis incorrecta cerca de 'O1'.

Respuesta

52

Especificar el nombre de alias antes DE comunicado Significado, que va a eliminar de la tabla de alias.

delete o1 
from @O as o1 
where ACount = 0 
     and exists (select Month 
        from @O o2 
        where o1.Month = o2.Month 
          and o2.ACount > 0) 


Resultado

alt text

+0

¡Vaya, no sabía acerca de esta sintaxis! Si no hubiera pegado la imagen, la hubiera rechazado como inválida. ¿Funciona esto en SQL2000 o solo en SQL Server 2005? Estoy en casa ahora mismo, así que no puedo verificarlo directamente. –

+0

Debería funcionar en SQL 2k/2k5/2k8 (se probó en 2k8 en la captura de pantalla) - Nunca se trató con SQL 7, por lo que no estoy seguro de 7 – Sung

8

Prueba de esto, se debe trabajar (la primera DESDE es opcional):

DELETE [FROM] @O 
FROM @O o1 
where ACount = 0 
and exists (select Month from @O o2 
     where o1.Month = o2.Month and o2.ACount > 0) 

La razón es: BORRAR, como explicó here, espera una abetos de tabla sin alias t, un FROM opcional puede precederlo. Después de eso puede poner un alias en una tabla en el segundo FROM, si necesita hacer un JOIN, subconsulta, etc.

Cuestiones relacionadas