Rumah >pangkalan data >tutorial mysql >Mengapakah lajur yang dikembalikan fungsi saya digabungkan dalam gabungan PostgreSQL, dan bagaimana saya boleh membetulkannya?

Mengapakah lajur yang dikembalikan fungsi saya digabungkan dalam gabungan PostgreSQL, dan bagaimana saya boleh membetulkannya?

Patricia Arquette
Patricia Arquetteasal
2024-12-31 18:39:10733semak imbas

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

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!

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