ホームページ > データベース > mysql チュートリアル > 関数から返された列が PostgreSQL 結合で連結されるのはなぜですか?それを修正するにはどうすればよいですか?

関数から返された列が PostgreSQL 結合で連結されるのはなぜですか?それを修正するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-31 18:39:10
オリジナル
768 人が閲覧しました

Why are my function's returned columns concatenated in a PostgreSQL join, and how can I fix it?

関数から返されたレコード内で連結された列

2 つ以上のテーブルのデータを結合する場合、次のような問題が発生しないように列を適切に分離することが重要です。データの不一致。ただし、PostgreSQL 9.2.4 などの特定のデータベース環境では、関数から返された列が 1 つの列に連結される場合に問題が発生する可能性があります。

問題の説明

考慮してくださいクエリに、アカウント ID と特定の日付に基づいてテーブルから履歴データを取得する関数が含まれるシナリオ。関数が直接実行されると、期待どおりの結果が返され、各列にはそれぞれのデータが含まれます。ただし、関数がより大きなクエリ内で使用される場合、関数の列は 1 つの列に連結されます。これにより、データの可読性と分析が大幅に妨げられる可能性があります。

解決策

この問題を解決するには、主に 2 つのアプローチがあります。

アプローチ 1 : 行の分解 (Postgres 9.3 または新しい)

Postgres 9.3 以降のバージョンでは、関数から返された行を分解するプロセスを簡素化する JOIN LATERAL 構文が導入されました。

SELECT '2014-08-12' AS day, 0 AS inbytes, 0 AS outbytes
      , a.username, a.accountid, a.userid
      , f.*   -- but avoid duplicate column names!
FROM account_tab a
      , account_servicetier_for_day(a.accountid, '2014-08-12') f  -- <-- HERE
WHERE a.isdsl = 1
AND a.dslservicetypeid IS NOT NULL
AND NOT EXISTS (
  SELECT * FROM dailyaccounting_tab
  WHERE day = '2014-08-12'
  AND accountid = a.accountid
)
ORDER BY a.username;
ログイン後にコピー

アプローチ 2: サブクエリレコード分解あり (Postgres 9.2 または旧バージョン)

Postgres バージョン 9.2 以前の場合、代替方法は、行の型を分解するサブクエリを使用することです。

SELECT '2014-08-12' AS day, 0 AS inbytes, 0 AS outbytes
      , a.username, a.accountid, a.userid
      , (a.rec).*   -- but be wary of duplicate column names!
FROM (
  SELECT *, account_servicetier_for_day(a.accountid, '2014-08-12') AS rec
  FROM account_tab a
  WHERE a.isdsl = 1
  AND a.dslservicetypeid Is Not Null
  AND NOT EXISTS (
    SELECT * FROM dailyaccounting_tab
    WHERE day = '2014-08-12'
    AND accountid = a.accountid
   )
) a
ORDER BY a.username;
ログイン後にコピー

これらのメソッドを実装すると、効果的に分解できます。関数から返された行を管理し、PostgreSQL でテーブルを結合するときに正確なデータ分離を保証します。

以上が関数から返された列が PostgreSQL 結合で連結されるのはなぜですか?それを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート