Question

Comment puis-je utiliser group by avec union dans t-sql? Je veux grouper par la première colonne d'un résultat d'union, j'ai écrit le code 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. merci beaucoup.

SELECT  *
FROM    ( SELECT    a.id ,
                    a.time
          FROM      dbo.a
          UNION
          SELECT    b.id ,
                    b.time
          FROM      dbo.b
        )
GROUP BY 1
Était-ce utile?

La solution

  

GROUP BY 1

Je n’ai jamais su que GROUP BY prenait en charge l’utilisation des ordinaux, uniquement ORDER BY. Quoi qu'il en soit, seul MySQL supporte GROUP BY, n'incluant pas toutes les colonnes sans fonctions d'agrégation exécutées dessus. Les ordinateurs ordinaires 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).

Il n'est pas nécessaire d'exécuter GROUP BY sur le contenu lorsque vous utilisez UNION - UNION veille à ce que les doublons soient supprimés. UNION ALL est plus rapide car ce n'est pas le cas - et dans ce cas, vous auriez besoin de GROUP BY ...

Votre requête doit uniquement être:

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

Autres conseils

Vous devez créer un alias pour 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 facile:

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 avec les 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 ne disposerez pas de lignes entièrement dupliquées entre les deux sous-tables du union, mais vous pouvez toujours très bien avoir plusieurs valeurs de temps pour une valeur de l’id, et vous ne donnez aucune indication de ce que vous voulez faire - min, max, moyen, somme ou quoi?! Le moteur SQL devrait donner une erreur à cause de cela (bien que certains tels que mysql ne choisissent qu'une valeur aléatoire parmi plusieurs valeurs, je pense que SQL Server est meilleur que cela).

Par exemple, changez la première ligne en SELECT id, MAX (heure) ou similaire!

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top