T-SQLでユニオンを使用してグループ化を使用する方法
-
05-07-2019 - |
質問
t-sqlでunionを使用してgroup byを使用するにはどうすればよいですか?結合の結果の最初の列でグループ化したいのですが、次のSQLを書きましたが、機能しません。ユニオン結果の指定された列(この場合は1)を参照する方法がわかりません。 本当にありがとう。
SELECT *
FROM ( SELECT a.id ,
a.time
FROM dbo.a
UNION
SELECT b.id ,
b.time
FROM dbo.b
)
GROUP BY 1
解決
GROUP BY 1
ORDER BYのみを使用して、序数の使用をサポートするGROUP BYを知らなかった。いずれにしても、集計関数が実行されていないすべての列を含まないGROUP BYをサポートするのはMySQLのみです。順序は、SELECTの順序に基づいている場合-変更された場合はORDER BY(またはサポートされている場合はGROUP BY)も変更するため、推奨されません。
UNION
を使用している場合、コンテンツに対して GROUP BY
を実行する必要はありません-UNIONは重複を削除します。 UNION ALL
は高速ではないため高速です。その場合、GROUP BY ...が必要になります...
クエリは次のもののみ必要です:
SELECT a.id,
a.time
FROM dbo.TABLE_A a
UNION
SELECT b.id,
b.time
FROM dbo.TABLE_B b
他のヒント
サブクエリのエイリアスを作成する必要があります。したがって、ステートメントは次のようになります。
Select Z.id
From (
Select id, time
From dbo.tablea
Union All
Select id, time
From dbo.tableb
) As Z
Group By Z.id
列の識別は簡単です:
SELECT *
FROM ( SELECT id,
time
FROM dbo.a
UNION
SELECT id,
time
FROM dbo.b
)
GROUP BY id
しかし、このクエリの主な問題は解決しません。最初の列の値をグループ化するときに、2番目の列の値をどうすればよいでしょうか? (特に!) UNION ALL
ではなく UNION
を使用しているので、ユニオン、ただし、idの1つの値に対して時間の値がいくつかあり、min、max、avg、sum、またはwhat ?!そのため、SQLエンジンはエラーを返すはずです(mysqlなどのいくつかは、ランダムな値を選択しますが、sql-serverはそれよりも優れていると思います)。
たとえば、最初の行を SELECT id、MAX(time)
などに変更します!
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