SQL クエリで DISTINCT を使用してすべての列を取得する
SQL の DISTINCT
キーワードは、指定された列に基づいて重複行を削除します。 ただし、列のサブセット内の個別の値のみを表示しながら すべて の列を取得するには、慎重な検討が必要です。 SELECT DISTINCT *
を単に使用することは、すべてのデータベース システムで確実にサポートされているわけではありません。
DISTINCT を使用した完全な列取得のソリューション
特定のデータベース システムに応じて、これを実現するためのいくつかの方法が存在します。
ROW_NUMBER()
ウィンドウ関数を使用するソリューションを提供します:<code class="language-sql">SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY field1 ORDER BY field2) AS row_number FROM table ) AS rows WHERE row_number = 1;</code>
これにより、各パーティション (field1
で定義) 内で field2
の順序で一意の行番号が割り当てられます。 次に、外側のクエリは各パーティションから最初の行のみを選択します。 field1
と field2
を適切な列に置き換えます。
GROUP BY
句は機能しますが、これはグループ化された列の個別の組み合わせごとに、他のすべての列が同じ値を持つことを保証できる場合に限られます。多くの場合、これは当てはまらず、予測できない結果を招く可能性があります。<code class="language-sql">SELECT * FROM table GROUP BY field1;</code>
DISTINCT ON
句を提供します:<code class="language-sql">SELECT DISTINCT ON (field1) * FROM table;</code>
これにより、field1
の各個別の値の最初の行のみが選択されます。
<code class="language-sql">SELECT * FROM table AS t1 INNER JOIN table AS t2 ON t1.field1 = t2.field1 INNER JOIN (SELECT field1, MIN(field2) AS min_field2 FROM table GROUP BY field1) AS distinct_fields ON t1.field1 = distinct_fields.field1 AND t1.field2 = distinct_fields.min_field2;</code>
これは、個別の field2
ごとに field1
の最小値を見つけて、元のテーブルに結合し直します。 必要な動作に応じて、MIN()
関数を調整する必要がある場合があります。
"table"
、"field1"
、"field2"
を実際のテーブル名と列名に置き換えてください。 最適なアプローチは、特定のデータベース システムと、指定された列に複数の行が同じ異なる値を持つ場合の望ましい動作によって異なります。
以上がDISTINCT を使用して SQL クエリ内のすべての列を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。