GROUP BY にない列を選んでいる
status で GROUP BY しているのに、選択リストに GROUP BY にも集約関数にもない name を入れてしまった例です。抜け候補として指摘されることを確かめます。
入力
SQL
SELECT status, name, count(*) FROM orders GROUP BY status
主キー(任意)
(空)
結果
エラー 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 があると、未グループ化の列は集約関数の外で参照できません(SELECT 文書 GROUP BY 句)。status は GROUP BY にあり、count(*) は集約関数なので OK、name だけが抜け候補になり、警告が 1 件出ます。
判定の根拠は仕様と根拠に、仕様の出典とともにまとめています。自分の入力で試すにはツールをお使いください。
このツールの制約
- 完全な SQL の構文解析はしません。誤検出を避けるため「抜け候補」と表示し、実行して確かめる前提です。
- 主キーによる関数従属は、利用者が入力した主キーを信じて扱います(PostgreSQL は主キーだけを認識します)。ユニーク制約は扱いません。
- サブクエリ・窓関数(OVER)・ROLLUP / CUBE / GROUPING SETS を含む項目は判定不能と表示します。
- 列名が重なる複数の表を結合した文で、別名をつけない列(修飾なし)の所属表は判定できません。HAVING と ORDER BY は調べません。
ご利用にあたって
- 結果は字句の読み取りにもとづく確認で、実際のデータベースでの解釈を保証するものではありません。
- ドキュメントは PostgreSQL License で公開されています。このサイトはその内容を要約して参照しており、転載はしていません。