30

T-SQL のユニオンで 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
4

4 に答える 4

109

サブクエリをエイリアスする必要があります。したがって、ステートメントは次のようになります。

Select Z.id
From    (
        Select id, time
        From dbo.tablea
        Union All
        Select id, time
        From dbo.tableb
        ) As Z
Group By Z.id
于 2009-10-29T05:10:27.390 に答える
24

GROUP BY 1

序数の使用をサポートするGROUPBYを知りませんでしたが、ORDERBYのみです。いずれにせよ、MySQLのみがGROUP BYをサポートしており、集計関数が実行されていないすべての列が含まれていません。SELECTの順序に基づいている場合、順序が変更された場合はORDER BY(またはサポートされている場合はGROUP BY)も変更されるため、序数も推奨されません。

GROUP BY使用しているときにコンテンツを実行する必要はありませんUNION-UNIONは、重複が削除されることを保証します。UNION ALLそうでないため、より高速です-その場合、GROUPBY...が必要になります。

クエリは次のようにする必要があります。

SELECT a.id,
       a.time
  FROM dbo.TABLE_A a
UNION
SELECT b.id,
       b.time
  FROM dbo.TABLE_B b
于 2009-10-22T03:29:39.457 に答える
8

列の識別は簡単です。

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

しかし、それはこのクエリの主な問題を解決しません。最初の列でグループ化するときに2番目の列の値をどうするか。(特に!)UNIONではなくを使用しているため、ユニオン内の2つのサブテーブル間で行が完全に重複するUNION ALLことはありませんが、idの1つの値に対して複数の時間値が存在する可能性があります。あなたがやりたいことのヒント-最小、最大、平均、合計、または何?!そのため、SQLエンジンはエラーを出すはずです(mysqlなどのいくつかはいくつかの中からランダムな値を選択するだけですが、sql-serverの方が優れていると思います)。

したがって、たとえば、最初の行をSELECT id, MAX(time)などに変更します。

于 2009-10-22T03:45:09.083 に答える