記述が最も簡単なクエリは、MySQL用です(厳密なANSI設定はありません)。非標準の構造を使用します。
SELECT key, value
FROM tableX
GROUP BY key ;
厳密な設定ONLY_FULL_GROUP_BY
がデフォルトの最新バージョン(5.7および8.0+)ANY_VALUE()
では、5.7で追加された機能を使用できます。
SELECT key, ANY_VALUE(value) AS value
FROM tableX
GROUP BY key ;
ウィンドウ関数(Postgres、SQL-Server、Oracle、DB2など)を持つ他のDBMSについては、このように使用できます。利点は、結果内の他の列も選択できることです(key
および以外value
)。
SELECT key, value
FROM tableX
( SELECT key, value,
ROW_NUMBER() OVER (PARTITION BY key
ORDER BY whatever) --- ORDER BY NULL
AS rn --- for example
FROM tableX
) tmp
WHERE rn = 1 ;
上記の古いバージョンおよびその他のDBMSの場合、ほぼすべての場所で機能する一般的な方法です。1つの欠点は、このアプローチでは他の列を選択できないことです。もう一つは、のようなもの集約関数であるMIN()
とMAX()
(ビット、テキスト、塊のような)一部のDBMSで一部のデータ型では動作しません。
SELECT key, MIN(value) AS value
FROM tableX
GROUP BY key ;
PostgreSQLには、DISTINCT ON
使用できる特別な非標準演算子があります。オプションORDER BY
は、すべてのグループからどの行を選択するかを選択するためのものです。
SELECT DISTINCT ON (key) key, value
FROM tableX
-- ORDER BY key, <some_other_expressions> ;