2

次の簡単な例を考えてみましょう。

prompt% sqlite3 test.db
sqlite> create table employee (
           employee_id   integer       primary key,
           first_name    varchar2(32)  not null,
           last_name     varchar2(32)  not null
        );

sqlite> insert into employee (first_name, last_name) values ('Bill', 'Smith');
sqlite> insert into employee (first_name, last_name) values ('Sally', 'Jones');
sqlite> insert into employee (first_name, last_name) values ('Bill', 'Jones');

sqlite> select first_name, count(*) from employee;

結果はどうなりますか?

素朴な人は、次のようになると想定するかもしれません。

Bill|2
Sally|1

しかし、経験者は、SELECT クエリに 'GROUP BY' 句がないことに気付くでしょう。Oracle は、このクエリを提示すると、実際にはエラーをスローします。

SQL ERROR: ORA-00937: not a single-group group function

ただし、SQLite は文句を言うのではなく、次の結果をもたらします。

Bill|3

これは私には偽物に思えます...行の総数を表示することは理にかなっていると思いますが、単に最後の「first_name」を選択するのはかなり恣意的で潜在的に危険に思えます。

これはバグですか、それとも私が理解できていない機能ですか? SQLite が同様のセーフティ ネットを提供しない理由はありますか?

4

1 に答える 1

5

これはすべて文書化されています:

SELECT ステートメントが GROUP BY 句のない集計クエリである場合、結果セット内の各集計式はデータセット全体で 1 回評価されます。結果セット内の各非集計式は、データセットの任意に選択された行に対して 1 回評価されます。各非集計式には、任意に選択された同じ行が使用されます...

結果セット内の集計式と非集計式を評価することによって作成された結果セット データの単一行は、GROUP BY 句を使用しない集計クエリの結果を形成します。GROUP BY 句のない集計クエリは、入力データの行がゼロであっても、常に 1 行のデータを返します。

簡単に言えば、セーフティネットはありません。必要に応じて GROUP BY を忘れないでください。

于 2013-04-02T16:38:42.270 に答える