次の「架空の」クエリと同じ結果セットを取得するクエリを作成する方法はありますか?
CREATE OR REPLACE VIEW v_report AS
SELECT
meta.refnum AS refnum,
codes.svc_codes AS svc_codes
FROM
t_bill AS meta
JOIN (SELECT
string_agg(p.service_code, ':') AS svc_codes
FROM
t_bill_service_services AS p
WHERE
p.refnum = meta.refnum
) AS codes
ON meta.refnum = codes.refnum
このクエリは架空のものです。これは、クエリのこの部分から参照できない句meta.refnum
内のエラーメッセージが表示されないためWHERE
です。
注1:簡潔にするために、他のさまざまなテーブルの多くの列も結合されていますが、省略されています。これにより、サブクエリを排除するいくつかのより単純なソリューションが排除される可能性があります。
注2:p.refnum
サブクエリに列を追加してaGROUP BY p.refnum
を実行し、WHERE
完全に削除することで、この作業を行うことができます(「作業」の一部の定義の場合)が、これはもちろん、t_bill_service_servicesテーブル全体がスキャンされて並べ替えられることを意味します-非常にテーブルがかなり大きいので、私の状況では非常に遅いです。
(SQLフレーバーはPostgresですが、string_agg()
呼び出しのみが非標準SQLである必要があるため、無関係である必要があります。)
JOIN
派生テーブルに移動するのではなくSELECT
、クエリの一部にサブクエリを配置できます。このセクションでは、サブクエリで親テーブルの値にアクセスできるため、他のテーブルの関連するエントリのみを集計します。例えば:
select meta.refnum,
(SELECT string_agg(p.service_code, ':')
FROM t_bill_service_services AS p
WHERE p.refnum = meta.refnum
) AS svc_codes
from t_bill meta
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加