2010-05-17 18 views
29

Estoy intentando ejecutar esto en MS-SQL, pero me devuelve un error justo en el Grupo por la líneaactualizaciones de grupo de SQL Server por

update #temp 
Set Dos=Count(1) 
From Temp_Table2010 s 
where Id=s.Total and s.total in (Select Id from #temp) 
group by s.Total 

hacer alguien sabe cómo puedo solucionar este problema teniendo un buen rendimiento.

+0

¿Puede describir lo que está tratando de hacer aquí? Trataré de ayudarte a volver a escribir la consulta, pero no puedo entender lo que estás tratando de lograr. Dado que los nombres de la tabla no son significativos, tal vez al menos pueda dar una lista de columnas en cada una y una muestra de los datos que está viendo. – SqlRyan

Respuesta

11

No puede usar un agregado en una consulta de ACTUALIZACIÓN, para empezar, aunque no incluyó el mensaje de error en su pregunta original, sospecho que eso es lo que le está diciendo.

Deberá calcular el agregado antes de su actualización y almacenar los resultados en una tabla temporal, y luego unirse a esa tabla para realizar su actualización.

48

Trate

;with counts 
AS 
( 
    SELECT total, COUNT(*) as dos 
    FROM temp_table2010 
    WHERE total in (select id from #temp) 
) 
UPDATE T 
SET dos=counts.dos 
FROM #temp T 
INNER JOIN counts 
    ON t.id = counts.total 
+3

esto se conoce como el uso de una Expresión de tabla común (o CTE). Algunos documentos: https://technet.microsoft.com/en-us/library/ms190766(v=sql.105).aspx y https: // msdn.microsoft.com/en-us/library/ms175972.aspx – mmcrae

+0

¿Qué hay con el punto y coma al comienzo de '; with counts', ¿tiene un propósito distinto de cerrar la instrucción anterior? – Splatmistro

+0

"con" significa algo más cuando no es el comienzo de una declaración. Los puntos y coma son opcionales en T-sql, por lo que el analizador debe deducir dónde deben ir los puntos y comas. Si hay una instrucción select inmediatamente anterior al CTE, es ambiguo para el analizador si es parte de la declaración anterior o es propia. el punto y coma principal lo hace explícito. Se ha adoptado como una convención para evitar problemas de análisis. –

14

En SQL Server que puede hacer la agregación en una consulta de actualización sólo hay que hacerlo de una subconsulta y luego unirse a ella en la tabla que desea actualizar.

UPDATE #temp 
SET  Dos = Cnt 
FROM #temp 
    INNER JOIN (SELECT Total, COUNT(*) AS Cnt FROM Temp_Table2010 GROUP BY Total) AS s 
     ON Id = s.Total 

Hacer esto:

WHERE total in (select id from #temp) 

Y luego:

INNER JOIN counts 
    ON t.id = counts.total 

es redundante.

La unión resuelve el requisito de "total en (...)". Agrupe en la clave y luego únase.