Heim >Datenbank >MySQL-Tutorial >Wie verhindert man mehrere Funktionsaufrufe mit „(func()).*' in älteren PostgreSQL-Versionen?

Wie verhindert man mehrere Funktionsaufrufe mit „(func()).*' in älteren PostgreSQL-Versionen?

DDD
DDDOriginal
2025-01-10 10:57:42440Durchsuche

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

Vermeiden wiederholter Funktionsaufrufe mit (func()).* in älteren PostgreSQL-Versionen

Das Problem

In PostgreSQL-Versionen vor 9.3 kann die Verwendung der (func()).*-Syntax (wobei func eine Tabelle zurückgibt) zu unbeabsichtigten Mehrfachausführungen der Funktion führen. Dies wirkt sich erheblich auf die Abfrageleistung aus.

Lösungen

Mehrere Methoden umgehen dieses Problem effektiv:

1. Unterabfrageansatz:

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

2. OFFSET 0-Technik:

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

3. CTE-Ansatz (Common Table Expression):

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

4. LATERAL JOIN (PostgreSQL 9.3 und höher):

<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>

Das obige ist der detaillierte Inhalt vonWie verhindert man mehrere Funktionsaufrufe mit „(func()).*' in älteren PostgreSQL-Versionen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn