Comment utiliser group by avec union dans t-sql? Je veux regrouper par la première colonne d'un résultat d'union, j'ai écrit le sql suivant mais cela ne fonctionne pas. Je ne sais tout simplement pas comment référencer la colonne spécifiée (dans ce cas, 1) du résultat de l'union. grand merci.
SELECT *
FROM ( SELECT a.id ,
a.time
FROM dbo.a
UNION
SELECT b.id ,
b.time
FROM dbo.b
)
GROUP BY 1
GROUPE PAR 1
Je n'ai jamais connu GROUP BY pour prendre en charge l'utilisation d'ordinaux, seulement ORDER BY. Quoi qu'il en soit, seul MySQL prend en charge GROUP BY, n'incluant pas toutes les colonnes sans fonctions d'agrégation exécutées sur elles. Les ordinaux ne sont pas non plus recommandés car s'ils sont basés sur l'ordre du SELECT - si cela change, votre ORDER BY (ou GROUP BY si pris en charge) en fait de même.
Il n'est pas nécessaire d'exécuter GROUP BY
sur le contenu lorsque vous utilisez UNION
- UNION garantit que les doublons sont supprimés; UNION ALL
est plus rapide car il ne l'est pas - et dans ce cas, vous auriez besoin du GROUP BY ...
Votre requête doit seulement être:
SELECT a.id,
a.time
FROM dbo.TABLE_A a
UNION
SELECT b.id,
b.time
FROM dbo.TABLE_B b
Vous devez alias la sous-requête. Ainsi, votre déclaration devrait être:
Select Z.id
From (
Select id, time
From dbo.tablea
Union All
Select id, time
From dbo.tableb
) As Z
Group By Z.id
Identifier la colonne est simple:
SELECT *
FROM ( SELECT id,
time
FROM dbo.a
UNION
SELECT id,
time
FROM dbo.b
)
GROUP BY id
Mais cela ne résout pas le problème principal de cette requête: que faire des valeurs de la deuxième colonne lors du regroupement par la première? Puisque (particulièrement!) Vous utilisez UNION
plutôt que UNION ALL
, Vous n'aurez pas entièrement dupliqué lignes entre les deux sous-tables de l'union, mais vous pouvez ont toujours très bien plusieurs valeurs de temps pour une valeur de l'id, et vous ne donnez aucune indication de ce que vous voulez faire - min, max, moy, somme, ou quoi?! Le moteur SQL devrait donner une erreur à cause de cela (bien que certains comme mysql choisissent simplement une valeur aléatoire parmi les plusieurs, je pense que sql-server est meilleur que cela).
Ainsi, par exemple, changez la première ligne en SELECT id, MAX(time)
ou similaire!