ホームページ >データベース >mysql チュートリアル >関数から返された列が PostgreSQL 結合で連結されるのはなぜですか?それを修正するにはどうすればよいですか?
関数から返されたレコード内で連結された列
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 サイトの他の関連記事を参照してください。