Frage

Wie kann ich mit Gruppe mit Union in T-SQL? Ich möchte von der ersten Spalte eines Ergebnisses der Vereinigung zu einer Gruppe, schrieb ich die folgende SQL, aber es funktioniert nicht. Ich weiß nur nicht, wie die angegebene Spalte referenzieren (in diesem Fall 1) der Vereinigung Ergebnisses. großer Dank.

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

Lösung

  

GROUP BY 1

Ich habe noch nie bekannt GROUP BY unterstützt ordinals verwenden, nur ORDER BY. So oder so, unterstützt nur MySQL GROUP BY ist nicht alle Spalten ohne Aggregatfunktionen einschließlich an ihnen durchgeführt. Ordinals nicht Praxis empfohlen, entweder weil, wenn sie in der Größenordnung der SELECT-basiert sind. - Wenn sich das ändert, so auch Ihre ORDER BY (oder GROUP BY wenn unterstützt)

Es gibt keine Notwendigkeit GROUP BY auf den Inhalt zu laufen, wenn Sie UNION verwenden - UNION stellt sicher, dass Duplikate entfernt werden; UNION ALL ist schneller, weil es nicht - und in diesem Fall würden Sie die GROUP BY müssen ...

Ihre Abfrage muss nur sein:

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

Andere Tipps

Sie müssen die Unterabfrage an Alias. Daher sollten Sie Ihre Aussage sein:

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

, um die Spalte zu identifizieren, ist einfach:

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

Aber es ist nicht das Hauptproblem dieser Abfrage lösen: Was tun mit der zweiten Spaltenwerte durchgeführt werden wird von der ersten auf die Gruppierung? Da (besonders!) Sie verwenden UNION statt UNION ALL, werden Sie nicht haben vollständig dupliziert Zeilen zwischen den beiden untergeordneten Tabellen in der Vereinigung, aber Sie können immer noch sehr gut mehrere Werte von Zeit für ein Wert der id, und Sie geben keinen Hinweis darauf, was Sie tun wollen - min, max, avg, sum, oder was ?! Die SQL-Engine sollte einen Fehler, weil der, dass (obwohl einige wie mysql nur einen zufälligen-ish Wert aus dem mehrere holen, ich glaube, SQL-Server ist besser als das).

So, zum Beispiel, ändern Sie die erste Zeile SELECT id, MAX(time) oder wie das!

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top