首頁 >資料庫 >mysql教程 >如何在 PostgreSQL 中正確找到特定年份範圍內球隊的球員?

如何在 PostgreSQL 中正確找到特定年份範圍內球隊的球員?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-02 22:31:39638瀏覽

How to Correctly Find Players on a Team Within a Specific Year Range in PostgreSQL?

在PostgreSQL 中尋找重疊的日期範圍

您提供了一個查詢,嘗試尋找某個特定團隊中的所有玩家給定年份,但它無法正常工作。讓我們解決您面臨的問題,並提供查找重疊日期範圍的替代解決方案。

原始查詢的問題:

  • 查詢錯誤地使用BETWEEN 運算子包含上限年份,而大多數情況會排除它。
  • 查詢不會檢查玩家是否從未離開過球隊,這也應該包括在內。

正確查詢:

找出給定球隊的所有在 2010年之前加入且未加入的球員2009年之前離開,您可以使用以下查詢:

SELECT DISTINCT p.*
FROM team AS t
JOIN contract AS c ON t.name_team = c.name_team
JOIN player AS p ON c.name_player = p.name_player
WHERE t.name_team = ?
AND c.date_join < '2010-01-01'
AND c.date_leave >= '2009-01-01';

其他注意事項:

  • 如果您的團隊表僅用於連接並且沒有添加任何必要的信息,您可以透過刪除它來簡化查詢。
  • 處理可能從未離開過球隊的玩家(在date_leave),可以使用OR 子句:
AND (c.date_leave >= '2009-01-01' OR c.date_leave IS NULL)

使用OVERLAPS 運算子:

PostgreSQL 也提供了OVERLAPS運算符,可以使用找到重疊的範圍。以下查詢使用OVERLAPS 尋找與範圍'2009-01-01'、'2010-01-01' 重疊的玩家:

SELECT DISTINCT name_player
FROM contract
WHERE name_team = ?
AND (date_join, COALESCE(date_leave, CURRENT_DATE)) OVERLAPS
      ('2009-01-01', '2010-01-01');

使用範圍類型:

在PostgreSQL 9.2 或更高版本中,您可以使用範圍類型來表示日期範圍。這提供了更好的性能並允許更輕鬆的索引支援。

CREATE TYPE date_range AS RANGE (date, date);

CREATE INDEX mv_stock_dr_idx ON mv_stock USING gist (daterange(date_join, date_leave));

SELECT DISTINCT name_player
FROM contract
WHERE name_team = ?
AND daterange(date_join, date_leave) &&&
      daterange('[2009-01-01,2010-01-01)'); -- upper bound excluded

以上是如何在 PostgreSQL 中正確找到特定年份範圍內球隊的球員?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn