POSTGRESQL 到 MYSQL:轉換 SELECT DISTINCT ON 查詢
導航資料庫遷移可能具有挑戰性,尤其是從 PostgreSQL 轉換到 MygreSQL 時。一個常見的查詢建構 SELECT DISTINCT ON 引發了對其 MySQL 對應項的疑問。
Postgresql SELECT DISTINCT ON
在PostgreSQL 中,SELECT DISTINCT ON 允許消除重複項基於指定表達式(col1、col2、col3)的行,同時保留每一個指定表達式個唯一集的「第一」行。例如,如果表格包含重複行:
col1 | col2 | col3 | col4 | col5 -------------------------------- 1 | 2 | 3 | 777 | 888 1 | 2 | 3 | 888 | 999 3 | 3 | 3 | 555 | 555
查詢SELECT DISTINCT ON (col1, col2, col3) col4, col5 FROM tablename 將會傳回:
col4 | col5 ----------- 777 | 888 555 | 555
選擇如果不指定ORDER BY 子句,「第一」行的值是不可預測的。
MySQL 擴充GROUP BY
MySQL 擴充了 GROUP BY 的使用,允許選擇未在 GROUP BY 子句中明確命名的非聚合列。然而,伺服器從每個群組中選擇的值是任意的,導致查詢輸出中出現不可預測的值。
轉換為 MySQL
MySQL 缺乏與PostgreSQL SELECT DISTINCT ON 建構。模擬其功能的一種方法是透過 GROUP BY 的 MySQL 擴充:
SELECT col4, col5 FROM tablename GROUP BY col1, col2, col3
此查詢將為每個 (col1, col2, col3) 集傳回「第一」行,類似於 PostgreSQL 查詢。但是,由於缺少 order by 子句,傳回的行仍然不確定。
可以透過修改查詢來實現更精確地選擇「第一」行:
SELECT t1.col4, t1.col5 FROM tablename t1 INNER JOIN (SELECT col1, col2, col3, MIN(col4) as m_col4 FROM tablename GROUP BY col1, col2, col3) s ON t1.col1=s.col1 AND t1.col2=s.col2 AND t1.col3=s.col3 AND t1.col4=s.m_col4 GROUP BY t1.col1, t1.col2, t1.col3, t1.col4
這查詢有效地檢索每個唯一表達式集(col1、col2、col3)的col4 最小值的行,從而提供更可預測的結果輸出。
結論
將 PostgreSQL 查詢轉換為 MySQL 對應項需要具體情況分析。雖然確切的等價物可能並不總是存在,但各種策略和解決方法提供了解決方案,從相對簡單到中等複雜,具體取決於查詢的性質。
以上是如何在 MySQL 中複製 PostgreSQL 的 SELECT DISTINCT ON 功能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!