ホームページ >データベース >mysql チュートリアル >PostgreSQL で配列引数を指定してセットを返す関数を効率的に複数回呼び出すにはどうすればよいですか?

PostgreSQL で配列引数を指定してセットを返す関数を効率的に複数回呼び出すにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-26 12:32:10913ブラウズ

How Can I Efficiently Call a Set-Returning Function with an Array Argument Multiple Times in PostgreSQL?

配列引数を使用して集合を返す関数を複数回呼び出す

この説明は、処理できる foo という名前の集合を返す関数を中心に説明します。特定のパラメータを利用したデータの配列であり、行のセットと追加の列を含む結果が提供されます。この関数は単一のデータ セットでは正常に動作しますが、参照用のデータ ID に依存せずに複数のデータ セットを処理しようとすると課題が発生します。

次の形式を利用するなど、構文を変更しようとするさまざまな試みが行われます。

SELECT dataid, (foo(ARRAY_AGG(data)),1).*
FROM dataset
WHERE dataid = something -- only testing on 1
GROUP BY dataid

が失敗したため、それぞれに対して関数が繰り返し呼び出されます。

解決策: 水平結合

PostgreSQL バージョン 9.3 以降では、LEFT JOIN LATERAL 構造を使用すると、通常、最適な結果が得られます。

SELECT sub.dataid, f.*
FROM (
   SELECT dataid, array_agg(data) AS arr
   FROM dataset
   WHERE dataid = something
   GROUP BY 1
   ) sub
LEFT JOIN LATERAL foo(sub.arr) f ON true;

この構文では、左側のすべての行が関数 foo が行を返さない場合でも、結合は保持されます。

foo が実際に行を返さず、それらの行を除外したい場合は、次の構文を使用できます:

CROSS JOIN LATERAL foo(sub.arr)

またはその短縮版:

, foo(sub.arr)

このアプローチは PostgreSQL マニュアルに記載されています。

以上がPostgreSQL で配列引数を指定してセットを返す関数を効率的に複数回呼び出すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。