Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menyertai Lajur Data Terhad Koma daripada Dua Jadual?

Bagaimana untuk Menyertai Lajur Data Terhad Koma daripada Dua Jadual?

Linda Hamilton
Linda Hamiltonasal
2025-01-03 15:31:39984semak imbas

How to Join Comma-Delimited Data Columns from Two Tables?

Menyertai Lajur Data Terhad Koma

Jadual data selalunya mengandungi nilai dipisahkan koma dalam sel. Mengekstrak dan menormalkan nilai ini boleh menjadi penting untuk analisis data selanjutnya. Dalam artikel ini, kami akan meneroka teknik untuk menggabungkan data yang dipisahkan koma dalam dua jadual dan membentangkan keputusan dalam format yang disatukan.

Pertimbangkan dua jadual berikut:

Jadual 1 ( T1)

col1 col2
C1 john
C2 alex
C3 piers
C4 sara

Jadual 2 (T2)

col1 col2
R1 C1,C2,C4
R2 C3,C4
R3 C1,C4

Keputusan yang Diingini:

col1 col2
R1 john,alex,sara
R2 piers,sara
R3 john,sara

Penyelesaian:

Normalisasi:

Penyelesaian yang ideal ialah menormalkan Jadual 2 dengan membahagikan nilai yang dipisahkan koma kepada hubungan yang berasingan. Ini akan mencipta jadual baharu dengan dua lajur: col1 dan col2, di mana setiap baris mewakili nilai yang disimpan sebelum ini dalam lajur col2 Jadual 2.

Sertai dengan Subquery (UNTUK LALUAN XML):

Jika normalisasi tidak dapat dilaksanakan, kita boleh menggunakan subquery bersama-sama dengan klausa FOR XML PATH untuk mendapatkan semula nilai dipisahkan koma sebagai rentetan tunggal.

SELECT col1, 
(
  SELECT ', '+t1.col2
  FROM t1
  WHERE ','+t2.col2+',' LIKE '%,'+CAST(t1.col1 AS VARCHAR(10))+',%'
  FOR XML PATH(''), TYPE
).value('substring(text()[1], 3)', 'VARCHAR(MAX)') AS col2
FROM t2;

Sertai dengan Fungsi Split:

Sebagai alternatif, kami boleh mencipta fungsi yang ditentukan pengguna yang dipanggil Split untuk mengekstrak individu nilai daripada rentetan dipisahkan koma.

CREATE FUNCTION [dbo].[Split](@String VARCHAR(MAX), @Delimiter CHAR(1))
RETURNS @temptable TABLE (items VARCHAR(MAX))
AS
BEGIN
    DECLARE @idx INT;
    DECLARE @slice VARCHAR(8000);

    SELECT @idx = 1;
    IF LEN(@String) < 1 OR @String IS NULL RETURN;

    WHILE @idx != 0
    BEGIN
        SET @idx = CHARINDEX(@Delimiter, @String);
        IF @idx != 0
            SET @slice = LEFT(@String, @idx - 1);
        ELSE
            SET @slice = @String;

        IF (LEN(@slice) > 0)
            INSERT INTO @temptable(Items) VALUES (@slice);

        SET @String = RIGHT(@String, LEN(@String) - @idx);
        IF LEN(@String) = 0 BREAK;
    END
RETURN;
END;

Menggunakan fungsi Split, kami boleh sama ada menyimpan nilai individu dalam baris yang berasingan atau menggabungkannya kembali ke dalam rentetan yang dipisahkan koma.

Atas ialah kandungan terperinci Bagaimana untuk Menyertai Lajur Data Terhad Koma daripada Dua Jadual?. 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