Rumah >pangkalan data >tutorial mysql >Mengapa Lajur Dikembalikan Fungsi Saya Disatukan dalam Pertanyaan PostgreSQL Saya?

Mengapa Lajur Dikembalikan Fungsi Saya Disatukan dalam Pertanyaan PostgreSQL Saya?

Susan Sarandon
Susan Sarandonasal
2024-12-26 13:27:11693semak imbas

Why Are My Function's Returned Columns Concatenated in My PostgreSQL Query?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn