que para all sql sql-server tsql group-by union

para - Cómo usar group by con union en t-sql



select union sql server (4)

GRUPO POR 1

Nunca he conocido a GROUP BY para admitir el uso de ordinales, solo ORDER BY. De cualquier manera, solo MySQL admite GROUP BY que no incluye todas las columnas sin funciones agregadas realizadas en ellas. Los ordinales tampoco son prácticas recomendadas porque si se basan en el orden de SELECT; si eso cambia, también lo hace su ORDER BY (o GROUP BY si es compatible).

No es necesario ejecutar GROUP BY en el contenido cuando utiliza UNION : UNION garantiza que se eliminen los duplicados; UNION ALL es más rápido porque no lo hace, y en ese caso necesitaría GROUP BY ...

Su consulta solo necesita ser:

SELECT a.id, a.time FROM dbo.TABLE_A a UNION SELECT b.id, b.time FROM dbo.TABLE_B b

¿Cómo puedo usar group by con union en t-sql? Quiero agrupar por la primera columna de un resultado de unión, escribí el siguiente sql pero no funciona. No sé cómo hacer referencia a la columna especificada (en este caso es 1) del resultado de la unión. muchas gracias.

SELECT * FROM ( SELECT a.id , a.time FROM dbo.a UNION SELECT b.id , b.time FROM dbo.b ) GROUP BY 1


Identificar la columna es fácil:

SELECT * FROM ( SELECT id, time FROM dbo.a UNION SELECT id, time FROM dbo.b ) GROUP BY id

Pero no resuelve el problema principal de esta consulta: ¿qué se debe hacer con los valores de la segunda columna al agruparlos por la primera? Ya que (¡peculiarmente!) Estás usando UNION lugar de UNION ALL , no tendrás filas duplicadas por completo entre las dos subtablas de la unión, pero es posible que tengas varios valores de tiempo para un valor de id, y no da ninguna pista de lo que quiere hacer: min, max, avg, sum, o qué? El motor SQL debería dar un error debido a eso (aunque algunos, como mysql, simplemente eligen un valor aleatorio entre varios, creo que sql-server es mejor que eso).

Entonces, por ejemplo, cambie la primera línea a SELECT id, MAX(time) o similar.


Necesitas alias la subconsulta. Por lo tanto, su declaración debe ser:

Select Z.id From ( Select id, time From dbo.tablea Union All Select id, time From dbo.tableb ) As Z Group By Z.id


with UnionTable as ( SELECT a.id, a.time FROM dbo.a UNION SELECT b.id, b.time FROM dbo.b ) SELECT id FROM UnionTable GROUP BY id