Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Mencegah Panggilan Berbilang Fungsi dengan `(func()).*` dalam Versi PostgreSQL Lama?

Bagaimana untuk Mencegah Panggilan Berbilang Fungsi dengan `(func()).*` dalam Versi PostgreSQL Lama?

DDD
Lepaskan: 2025-01-10 10:57:42
asal
394 orang telah melayarinya

How to Prevent Multiple Function Calls with `(func()).*` in Older PostgreSQL Versions?

Mengelakkan Panggilan Fungsi Berulang dengan (func()).* dalam Versi PostgreSQL Lama

Isunya

Dalam versi PostgreSQL sebelum 9.3, menggunakan sintaks (func()).* (di mana func mengembalikan jadual) boleh membawa kepada pelaksanaan berbilang fungsi yang tidak diingini. Ini memberi kesan ketara kepada prestasi pertanyaan.

Penyelesaian

Beberapa kaedah berkesan memintas masalah ini:

1. Pendekatan Subkueri:

<code class="language-sql">SELECT (mf).* FROM (
    SELECT my_func(x) AS mf FROM some_table
) sub;</code>
Salin selepas log masuk

2. Teknik OFFSET 0:

<code class="language-sql">SELECT (mf).* FROM (
    SELECT my_func(x) AS mf FROM some_table OFFSET 0
) sub;</code>
Salin selepas log masuk

3. Pendekatan CTE (Ungkapan Jadual Biasa):

<code class="language-sql">WITH tmp(mf) AS (
    SELECT my_func(x) FROM some_table
)
SELECT (mf).* FROM tmp;</code>
Salin selepas log masuk

4. SERTAI LATERAL (PostgreSQL 9.3 dan lebih baru):

<code class="language-sql">
SELECT mf.*
FROM some_table
LEFT JOIN LATERAL my_func(some_table.x) AS mf ON true;
```  This is the preferred method for PostgreSQL 9.3 and above.


### Explanation

The root cause lies in how PostgreSQL's parser handles `(func()).*` in older versions.  The wildcard expands into individual column selections, mistakenly causing the function to be called repeatedly for each column.


### Why Repeated Calls Occur

Pre-9.3 PostgreSQL parsers interpret `(func()).*` by replicating nodes within the parse tree.  This replication results in a separate function call for every selected column, even if a single call would suffice.</code>
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Mencegah Panggilan Berbilang Fungsi dengan `(func()).*` dalam Versi PostgreSQL Lama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan