Rekod Dikembalikan daripada Function Shows Concatenated Lajur: Membongkar Punca
Dalam pertanyaan, menyertai jadual dan mendapatkan semula data sejarah daripada fungsi, pengguna mungkin menghadapi masalah di mana lajur yang dikembalikan daripada fungsi kelihatan digabungkan menjadi satu rentetan. Anomali ini timbul apabila menggunakan fungsi secara terus dalam pertanyaan utama.
Memahami Isu
Apabila menanyakan fungsi yang mengembalikan berbilang lajur, seperti:
account_servicetier_for_day(acct.accountid, '2014-08-12')
ia mengembalikan rekod yang mengandungi data yang diminta. Walau bagaimanapun, apabila rekod ini dibenamkan dalam pertanyaan lain, PostgreSQL mentafsirkannya sebagai rentetan bercantum tunggal.
Output Fungsi Mengurai
Untuk membetulkannya, pengguna harus mengekstrak individu tersebut lajur daripada rekod fungsi. Dalam PostgreSQL versi 9.3 dan lebih baru, ini boleh dicapai menggunakan sintaks JOIN LATERAL, yang membenarkan penyepaduan lancar fungsi ke dalam klausa FROM:
JOIN LATERAL account_servicetier_for_day(a.accountid, '2014-08-12') f ON TRUE
Klausa ON TRUE memastikan semua baris dari sebelah kiri jadual dicantumkan dengan hasil fungsi, tanpa mengira bilangan baris dikembalikan.
Dalam PostgreSQL 9.2 dan lebih awal, mengekstrak data lajur memerlukan subkueri eksplisit:
(SELECT *, account_servicetier_for_day(a.accountid, '2014-08-12') AS rec FROM account_tab a) AS a
Di sini, subkueri memberikan hasil panggilan fungsi kepada rekod bernama rec. Pertanyaan luar kemudiannya boleh merujuk kepada lajur rekod, seperti a.rec.timestamp.
Mengelakkan Tidak Masuk (Subquery)
Akhir sekali, adalah disyorkan untuk mengelak daripada menggunakan NOT IN (subquery) untuk pengecualian set. Sebaliknya, pilih klausa NOT EXISTS, yang lebih cekap dan kurang terdedah kepada isu prestasi.
Atas ialah kandungan terperinci Mengapa Lajur Dikembalikan Fungsi Saya Disatukan dalam Pertanyaan PostgreSQL Saya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!