Query

如何為一列選擇不同的列和另一列中的任何列?

  • March 8, 2021

我需要查詢 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),您可以像這樣使用它們。優點是您也可以選擇結果中的其他列(除了keyand 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,這是一種幾乎在任何地方都可以使用的通用方式。一個缺點是您無法使用這種方法選擇其他列。另一個是聚合函式喜歡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> ;

引用自:https://dba.stackexchange.com/questions/24327