Wie Gruppe verwenden, indem Sie mit Union in T-SQL
-
05-07-2019 - |
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
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