ファイアバードグループのロジックが理解できない
クエリ:
SELECT t.id FROM T1 t
INNER JOIN T2 j ON j.id = t.jid
WHERE t.id = 1
GROUP BY t.id
完璧に動作します
しかし、他のフィールドを取得しようとすると、次のようになります。
SELECT * FROM T1 t
INNER JOIN T2 j ON j.id = t.jid
WHERE t.id = 1
GROUP BY t.id
エラーが発生します: Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause)
GROUP BY
クエリで使用する場合、指定された1つまたは複数のフィールドが「キー」として使用され、データ行はこれら2つのフィールドの一意の組み合わせに基づいてグループ化されます。結果セットでは、このような一意の組み合わせはすべて1行のみです。
あなたの場合、グループ内の唯一の識別子はt.id
です。ここで、テーブルに2つのレコードがあり、両方ともが付いているがt.id = 1
、別の列の値が異なるとしますt.name
。たとえば、。と列の両方を選択しようとするid
とname
、1つのグループが1つの行しか持てないという制約と直接矛盾します。そのため、グループキー以外のフィールドは選択できません。
集計関数の場合は異なります。これは、値を合計またはカウントするか、最大値を取得するときに、基本的にid
フィールドのみに基づいてその操作を実行し、他の列のデータを事実上無視するためです。したがって、たとえば、特定のIDを持つすべての名前の数に対する答えは1つしかないため、問題はありません。
結論として、結果に列を表示する場合は、それでグループ化する必要があります。ただし、これによりグループ化がより細かくなり、望ましくない場合があります。その場合、次のようなことができます。
select * from T1 t
where t.id in
(SELECT t.id FROM T1 t
INNER JOIN T2 j ON j.id = t.jid
WHERE t.id = 1
GROUP BY t.id)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加