PostgreSQL 與 MySQL:GROUP BY 子句比較
將 MySQL 查詢移轉到 PostgreSQL 可能會導致錯誤「列 'XYZ' 必須出現在 GROUP BY 子句中或在聚合函數中使用」。這種差異源自於這些資料庫處理 GROUP BY
子句的方式。
MySQL 的非標準方法
MySQL 的 GROUP BY
實作偏離了 SQL 標準。 它允許選擇 GROUP BY
子句中未明確列出的列,從而導致不可預測的輸出。 從每組中選擇的行是隱式決定的,受索引和查詢最佳化等因素的影響。
PostgreSQL 符合標準GROUP BY
然而,PostgreSQL 嚴格遵守 SQL 標準。 SELECT
清單中的所有欄位必須包含在 GROUP BY
子句中或是聚合函數的一部分(如 SUM
、AVG
、COUNT
)。 否則會出現上述錯誤。
在 PostgreSQL 中複製 MySQL 的行為
雖然 PostgreSQL 的方法更具可預測性且符合標準,但您可以使用 DISTINCT ON
來模擬 MySQL 的非標準行為。以下 PostgreSQL 查詢示範了這一點:
<code class="language-sql">SELECT DISTINCT ON (availables.bookdate) availables.*, rooms.hotel_id FROM availables INNER JOIN rooms ON rooms.id = availables.room_id WHERE rooms.hotel_id = 5056 AND availables.bookdate BETWEEN '2009-11-22' AND '2009-11-24' ORDER BY availables.updated_at;</code>
DISTINCT ON
為 availables.bookdate
中的每個不同值傳回一行,保持 ORDER BY
子句指定的行順序。 這有效地模仿了 MySQL 在這個特定場景中的非標準 GROUP BY
行為。 請注意,此方法依賴 ORDER BY
子句來定義為每個不同群組選擇哪一行。
以上是為什麼我的 MySQL GROUP BY 查詢在 PostgreSQL 中失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!