Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menyertai Lajur Data Terhad Koma daripada Dua Jadual?
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!