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