Rumah >pangkalan data >tutorial mysql >Mengapakah lajur yang dikembalikan fungsi saya digabungkan dalam gabungan PostgreSQL, dan bagaimana saya boleh membetulkannya?
Lajur Disatukan dalam Rekod Dikembalikan daripada Fungsi
Apabila menyertai data daripada dua atau lebih jadual, adalah penting untuk memastikan pengasingan lajur yang betul untuk mengelakkan ketidakselarasan data. Walau bagaimanapun, persekitaran pangkalan data tertentu, seperti PostgreSQL 9.2.4, mungkin menghadapi isu apabila lajur yang dikembalikan daripada fungsi digabungkan menjadi satu lajur.
Penerangan Isu
Pertimbangkan senario di mana pertanyaan melibatkan fungsi yang mendapatkan semula data sejarah daripada jadual berdasarkan ID akaun dan tarikh tertentu. Apabila fungsi dilaksanakan secara langsung, keputusan dikembalikan seperti yang diharapkan, dengan setiap lajur mengandungi data masing-masing. Walau bagaimanapun, apabila fungsi itu digunakan dalam pertanyaan yang lebih besar, lajur daripada fungsi menjadi digabungkan menjadi satu lajur. Ini boleh menghalang kebolehbacaan dan analisis data dengan ketara.
Penyelesaian
Untuk menyelesaikan isu ini, terdapat dua pendekatan utama:
Pendekatan 1 : Baris Mengurai (Postgres 9.3 atau Lebih baharu)
Postgres 9.3 dan versi yang lebih baru memperkenalkan sintaks JOIN LATERAL, yang memudahkan proses penguraian baris yang dikembalikan daripada fungsi:
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;
Pendekatan 2: Subquery dengan Penguraian Rekod (Postgres 9.2 atau Lama)
Untuk Postgres versi 9.2 dan lebih lama, kaedah alternatif ialah menggunakan subkueri yang menguraikan jenis baris:
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;
Dengan melaksanakan kaedah ini, anda boleh mengurai dengan berkesan baris yang dikembalikan daripada fungsi dan memastikan pengasingan data yang tepat apabila menyertai jadual dalam PostgreSQL.
Atas ialah kandungan terperinci Mengapakah lajur yang dikembalikan fungsi saya digabungkan dalam gabungan PostgreSQL, dan bagaimana saya boleh membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!