GROUP BYステートメントのワイルドカードが機能しないのはなぜですか?


29

次のSQLステートメントを機能させようとしていますが、構文エラーが発生します。

SELECT A.*, COUNT(B.foo)
FROM TABLE1 A
LEFT JOIN TABLE2 B ON A.PKey = B.FKey
GROUP BY A.*

ここで、Aは40列の幅の広いテーブルであり、可能であればGROUP BY句に各列名をリストしないようにします。同様のクエリを実行する必要のあるこのようなテーブルが多数あるため、ストアドプロシージャを作成する必要があります。これにアプローチする最良の方法は何ですか?

MS SQL Server 2008を使用しています。

回答:


32

GROUP BY A.* SQLでは許可されていません。

グループ化するサブクエリを使用してこれをバイパスし、結合することができます:

SELECT A.*, COALESCE(B.cnt, 0) AS Count_B_Foo
FROM TABLE1 AS A
  LEFT JOIN 
      ( SELECT FKey, COUNT(foo) AS cnt
        FROM TABLE2 
        GROUP BY FKey
      ) AS B 
    ON A.PKey = B.FKey ;

SQL-2003標準には、機能的にそれらに依存している限りSELECTGROUP BYリスト内にリストにない列を許可する機能があります。その機能がSQL-Serverに実装されていた場合、クエリは次のように記述できます。

SELECT A.*, COUNT(B.foo)
FROM TABLE1 A
LEFT JOIN TABLE2 B ON A.PKey = B.FKey
GROUP BY A.pk                          --- the Primary Key of table A

残念ながら、この機能はまだ実装されておらず、SQL-Server 2012バージョンでも、そして私が知る限り他のDBMSでも実装されていません。それを持っているが不十分なMySQLを除いて(不適切:上記のクエリは機能しますが、エンジンは機能的な依存関係をチェックせず、他の不適切なクエリは間違った、半ランダムな結果を表示します)。

@マークByers氏はコメントで私たちを知らせ、PostgreSQLの9.1は、新しい機能を追加、この目的のために設計されています。MySQLの実装よりも制限的です。


書かれているように標準のその部分を実装するいくつかのRDBMSに言及できますか?私は、MySQLが(適切な設定与えられた)あなたは内の項目をない含めることができるようになると、例えば、知っているGROUP BY中で句SELECTリストが、それはそれは価値が列または式ならば(soから来ることをどの行へと未定義のままISN 「tはグループ化式の際に機能的に依存し、それは可能性)グループ内の任意の行から来ます。
アダムロビンソン

@Adam:いいえ、実装されているRDBMSを知りません。あなたのコメントにあるように、MySQLにはそれがありますが、不十分です。
ypercubeᵀᴹ

わかった。このサイトで質問に答えるほとんどの人が想像するよりもはるかに少ないRDBMSでの経験があるので、実際にあるかどうかを尋ねていました;)しかし、それは私の疑いでした。
アダムロビンソン

3
「そして、私が知る限り、他のDBMSにはありません。」PostgreSQL 9.1は、この目的のために設計された新しい機能を追加しました。MySQLの実装よりも制限的です。
マークバイヤーズ

@MarkByers:thnx、私はそれを知りませんでした。
ypercubeᵀᴹ

24

@ypercubeの回避策に加えて、「タイピング」はを使用する言い訳にはなりませんSELECT *。これについてはここ書きましたが、回避策を講じたSELECTとしても、40などの膨大な数がある場合でも、リストには列名を含める必要があります。

簡単に言えば、オブジェクトエクスプローラーでオブジェクトの列ノードをクリックし、クエリウィンドウにドラッグすることで、これらの大きなリストの入力を避けることができます。スクリーンショットはビューを示していますが、テーブルに対しても同じことができます。

ここに画像の説明を入力してください

しかし、アイテムを数インチドラッグするという多大な労力にさらされるべきであるすべての理由について読みたい場合は、私の投稿を読んください。:-)


PostgreSQL(EMS SQL Managerを使用)では、ビューをとしてSELECT *定義し、ビュー定義からフィールドリストをコピーします。
dezso

私は確かSELECT *に使用すべきではないことに同意します。GROUP BYしかし、私はこの事件に興味があります。@Aaron、グループ化リストに40の列があることで効率の問題はありますか?
ypercubeᵀᴹ

1
@ypercube-あなたがA.PK, A.some, A.other, A.columnsそれをグループ化するかどうかを見た限りでは、実際にsome, other, columnsこれを比較することは気にしません 。これは構文で必要なだけです。
マーティンスミス

1
@datagod申し訳ありませんが、いいえ、ギャップはSSMS開発チームによってのみ説明できます。:-)
アーロンバートランド

1
@Pacerier申し訳ありませんが、私は完全に同意しませんが、多分あなたは詳述することができます。
アーロンバートランド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.