T-SQLでユニオンとグループバイを使用するにはどうすればよいですか?ユニオンの結果の最初の列でグループ化したいのですが、次の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
を使用しているため、ユニオンの2つのサブテーブル間に完全に複製行はありませんが、 idの1つの値に対して複数の時間の値があり、min、max、avg、sum、またはwhat ?!そのため、SQLエンジンはエラーを出すはずです(mysqlなどのいくつかは、ランダムな値を選択しますが、sql-serverはそれよりも優れていると思います)。
したがって、たとえば、最初の行をSELECT id, MAX(time)
などに変更します!