1

SQLite は、集計を処理するとき、他の多くの RDBMS とは異なる動作をします。次の表と値を考慮してください。

create table foo (a int, b int);
insert into foo (a, b) values (1, 10);
insert into foo (a, b) values (2, 11);
insert into foo (a, b) values (3, 12);

このようにクエリすると:

select a, group_concat(b) from foo;

通常、GROUP BY 句に列 'a' を含めていないため、エラーが発生することが予想されます。以下は、SQL Server によって生成されたエラーです (PostgreSQL は同様のものを出力します)。

Column 'foo.a' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

一方、SQLite はそれに従って、次の結果を生成します。

3|10,11,12

これでいいの?列「a」の値はどのように選択されましたか? 別の行を追加すると、何を選択しているのかにパターンがあるように見えます。おそらく、最近追加された行を使用していると暫定的に言うことができますが、単に不確定である可能性があります.

sqlite> insert into foo (a, b) values (2, 13);
sqlite> select a, group_concat(b) from foo;
2|10,11,12,13

これは私にはバグのように思えますが、ここにいるデータベースの専門家がそれについて何と言っているか疑問に思っています.

(Ubuntu で SQLite バージョン 3.6.16 を使用しています。)

4

2 に答える 2

1

これは、複数のグループ化された列を選択しているが、グループ化のために 1 つの列を実際にテストするクエリ エンジンのみが必要な場合に便利な動作です。たとえば、次のようにします。

Orders および OrderDetails テーブルが与えられます。

SELECT O.OrderID, O.OrderDate, SUM(OD.Price * OD.Quantity) TotalPrice
FROM Orders O NATURAL JOIN OrderDetails OD
GROUP BY O.OrderID

他のデータベースでは、OrderID と OrderDate の両方を group by に含める必要があります。この場合、データベースは両方の列でグループ化されますが、これは冗長です。OrderID のみでグループ化することにより、より効率的で少ないコードで同じ結果が得られます。

于 2010-01-22T22:57:19.203 に答える
0

また、MySQL はa、一致した行 (通常は最初の行) の中から不確定な値を返します。SQL Server と PostgreSQL は、各列のあいまいさを解消する決定をユーザーに強制することで、怠惰を防いでいるだけです。

于 2010-01-22T23:17:51.993 に答える