Query
如何為一列選擇不同的列和另一列中的任何列?
我需要查詢 SQL 數據庫以查找一列的所有不同值,並且我需要另一列的任意值。例如,考慮下表包含兩列,鍵和值:
key value === ===== one test one another one value two goes two here two also three example
我希望從每個不同的鍵中取回一個任意選擇的樣本行,也許得到這三行:
key value === ===== one test two goes three example
如何在 SQL 中製定這樣的查詢?
最容易編寫的查詢是針對 MySQL(沒有嚴格的 ANSI 設置)。它採用非標準結構:
SELECT key, value FROM tableX GROUP BY key ;
在最新版本(5.7 和 8.0+)中,嚴格設置 和
ONLY_FULL_GROUP_BY
是預設設置,您可以使用ANY_VALUE()
5.7 中添加的功能:SELECT key, ANY_VALUE(value) AS value FROM tableX GROUP BY key ;
對於其他具有視窗函式的 DBMS(如 Postgres、SQL-Server、Oracle、DB2),您可以像這樣使用它們。優點是您也可以選擇結果中的其他列(除了
key
andvalue
):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,這是一種幾乎在任何地方都可以使用的通用方式。一個缺點是您無法使用這種方法選擇其他列。另一個是聚合函式喜歡
MIN()
和MAX()
不使用某些 DBMS 中的某些數據類型(如位、文本、blob):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> ;