GROUP BY の入れ忘れ候補
GROUP BY に入れ忘れた列を、実行前に候補として見つける。
SELECT 文を貼り付けると、選択リストの列が GROUP BY にも集約関数にも入っていない「抜け候補」を探します。主キーでグループ化した場合の関数従属は、利用者が入力した主キーをもとに扱います。入力はブラウザの外へ送信しません。
SELECT 文を貼り付けて GROUP BY の抜けを調べる
入力した内容は送信されません。貼り付けた文字や選んだファイルは、お使いのブラウザの中だけで処理します。本サイトのサーバーや第三者へ送信・保存しません(通信を禁止する設定でページを配信しています)。
結果
エラー 0 件・警告 1 件・情報 0 件
指摘(エラー・警告・情報)
- 警告 1 行目 2 番目「name」: name は GROUP BY になく、集約関数の外にあります。GROUP BY に加えるか、max() などの集約関数で包んでください。同じ表の主キーで GROUP BY しているなら、主キーを入力欄に書くと従属として扱います(SELECT 文書 GROUP BY 句)。
| 選択リストの項目 | 3 個 |
|---|---|
| 抜け候補 | 1 個 |
| OK | 2 個 |
| 判定不能 | 0 個 |
項目ごとの判定
| # | 選択リストの式 | 集約の外にある列 | 判定 | 理由 |
|---|---|---|---|---|
| 1 | status | status | OK | GROUP BY に同じ式(または位置番号・別名)がある |
| 2 | name | name | 抜け候補 | name が GROUP BY になく、集約関数の外にある |
| 3 | count(*) | - | OK | 列は集約関数の中だけ |
初期表示は入力例「GROUP BY にない列を選んでいる」の結果です。入力を変えるとその場で処理し直します。判定の根拠は仕様と根拠にまとめています。
ご利用にあたって
- 結果は字句の読み取りにもとづく確認で、実際のデータベースでの解釈を保証するものではありません。
- ドキュメントは PostgreSQL License で公開されています。このサイトはその内容を要約して参照しており、転載はしていません。
使い方
- 調べたい SELECT 文を入力欄に貼り付けます。
- 主キーで GROUP BY している場合は、その列を「主キー」欄に書きます(例: c.id)。
- 表の「判定」が抜け候補の項目を、GROUP BY に加えるか集約関数で包んで直します。
入力例と結果
代表的な入力・境界の入力・壊れた入力の例です。例ごとに入力・出力・指摘と、その結果になる理由(検算)を載せています。
| 入力例 | 結果 |
|---|---|
| GROUP BY にない列を選んでいる | エラー 0 件・警告 1 件・情報 0 件 |
| 主キーで GROUP BY した場合の関数従属 | エラー 0 件・警告 0 件・情報 2 件 |
| 集約関数だけの SELECT | エラー 0 件・警告 0 件・情報 1 件 |
| 位置番号と出力列名で GROUP BY する | エラー 0 件・警告 0 件・情報 1 件 |
| 集約も GROUP BY もない SELECT | エラー 0 件・警告 0 件・情報 1 件 |
このツールでできないこと(制約)
- 完全な SQL の構文解析はしません。誤検出を避けるため「抜け候補」と表示し、実行して確かめる前提です。
- 主キーによる関数従属は、利用者が入力した主キーを信じて扱います(PostgreSQL は主キーだけを認識します)。ユニーク制約は扱いません。
- サブクエリ・窓関数(OVER)・ROLLUP / CUBE / GROUPING SETS を含む項目は判定不能と表示します。
- 列名が重なる複数の表を結合した文で、別名をつけない列(修飾なし)の所属表は判定できません。HAVING と ORDER BY は調べません。
よくある質問
集約関数だけで GROUP BY がない SELECT も調べますか?
調べます。count や max などの集約関数があると、GROUP BY がなくても集約の外の列は書けないためです(SELECT 文書 GROUP BY 句)。count(*) と列を同時に選ぶと抜け候補になります。
主キーを入力しないとどうなりますか?
主キーによる関数従属は使わず、GROUP BY にない列はすべて抜け候補になります。主キーで GROUP BY していて抜け候補が出たときは、主キー欄に書くと従属として扱います。
貼り付けた SQL はどこかに送られますか?
送られません。処理はお使いのブラウザの中だけで行い、ページは通信を禁止する設定(CSP の connect-src)で配信しています。