Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mensimulasikan SQL Server TOP n DENGAN IKATAN dalam PostgreSQL?

Bagaimana untuk Mensimulasikan SQL Server TOP n DENGAN IKATAN dalam PostgreSQL?

DDD
DDDasal
2025-01-04 19:01:41962semak imbas

How to Simulate SQL Server's TOP n WITH TIES in PostgreSQL?

PostgreSQL Equivalent for TOP n WITH TIES: LIMIT "with ties"

PostgreSQL tidak menawarkan setara langsung dengan TOP n WITH SQL Server Klausa TIES. Klausa LIMIT dalam PostgreSQL digunakan untuk menentukan bilangan baris untuk dikembalikan, tetapi ia tidak termasuk ikatan.

Pendekatan Alternatif Menggunakan Ungkapan Jadual Biasa (CTE)

Dalam versi PostgreSQL sehingga 12, pendekatan alternatif melibatkan penggunaan Common Table Expression (CTE) dengan fungsi ranking untuk simulasikan gelagat WITH TIES:

WITH cte AS (
   SELECT *, rank() OVER (ORDER BY <something>) AS rnk
   FROM   tbl
   )
SELECT *
FROM   cte
WHERE  rnk <= n;

Di sini, rank() memberikan kedudukan kepada setiap baris berdasarkan klausa ORDER BY. Perbandingan <= dalam klausa WHERE memastikan bahawa semua baris dengan kedudukan kurang daripada atau sama dengan n dipilih, termasuk sebarang ikatan.

Alternatif Lebih Pantas untuk Jadual Besar dalam PostgreSQL 12 atau Lebih Lama

Untuk meja besar, pendekatan alternatif yang lebih pantas daripada kaedah CTE disediakan di sini:

[Setara untuk FETCH FIRST WITH TIES dalam Postgres 11 dengan prestasi setanding](https://www.db-fiddle.com/f/h6i8rtyv234ucf653j9k8x46q/0)

Sehingga PostgreSQL 13, klausa WITH TIES telah ditambah secara rasmi. Klausa ini boleh digunakan terus dengan klausa LIMIT untuk mencapai gelagat yang diingini:

SELECT *
FROM   tablename
ORDER BY nums DESC
LIMIT 3 WITH TIES;
Ini akan mengembalikan {10, 9, 8, 8}, seperti yang dikehendaki, dengan mengambil 3 baris teratas dan termasuk tambahan 8 baris yang terikat dengan baris ketiga.

Atas ialah kandungan terperinci Bagaimana untuk Mensimulasikan SQL Server TOP n DENGAN IKATAN dalam PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn