Heim >Datenbank >MySQL-Tutorial >Wie kann man durch Kommas getrennte Datenspalten in Datenbanken effizient verknüpfen?

Wie kann man durch Kommas getrennte Datenspalten in Datenbanken effizient verknüpfen?

Susan Sarandon
Susan SarandonOriginal
2024-12-27 16:07:10457Durchsuche

How to Efficiently Join Comma-Separated Data Columns in Databases?

Komma-getrennte Datenspalten verbinden: Detaillierte Lösungen

In Datenbanksystemen ist es oft notwendig, in Komma-getrennte Datenspalten zu manipulieren. getrennte Spalten. Die Normalisierung von Daten in mehreren Tabellen ist eine ideale Lösung, es gibt jedoch Fälle, in denen dies möglicherweise nicht möglich ist. Hier stellen wir verschiedene Methoden vor, um durch Kommas getrennte Spalten effizient zu verbinden.

Normalisierung und Tabellenverknüpfungen

Die Normalisierung der Daten in separate Tabellen ist der effizienteste Ansatz. Dazu gehört das Erstellen einer neuen Tabelle mit einer Zeile für jeden eindeutigen Wert in der durch Kommas getrennten Spalte. Die Tabellen können dann mithilfe einer Fremdschlüsselbeziehung verknüpft werden.

-- T1 Table
CREATE TABLE T1
(
  col1 varchar(2), 
  col2 varchar(5),
  constraint pk1_t1 primary key (col1)
);

-- T2 Table
CREATE TABLE T2
(
  col1 varchar(2), 
  col2 varchar(2),
  constraint pk1_t2 primary key (col1, col2),
  constraint fk1_col2 foreign key (col2) references t1 (col1)
);

Nach der Normalisierung können die Daten einfach mithilfe eines Joins abgefragt werden:

SELECT t2.col1, t1.col2
FROM t2
INNER JOIN t1
  ON t2.col2 = t1.col1

Benutzerdefinierte Split-Funktion für Nicht normalisierte Daten

Wenn eine Normalisierung nicht möglich ist, können wir eine benutzerdefinierte Aufteilungsfunktion erstellen, um die durch Kommas getrennten Daten zu konvertieren in einzelne Zeilen.

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;

Mit dieser Funktion können wir die Originaltabelle mit den geteilten Daten verbinden:

;WITH cte AS
(
  SELECT c.col1, t1.col2
  FROM t1
  INNER JOIN 
  (
    SELECT t2.col1, i.items col2
    FROM t2
    CROSS APPLY dbo.split(t2.col2, ',') i
  ) c
    ON t1.col1 = c.col2
)
SELECT DISTINCT c.col1, 
  STUFF(
         (SELECT DISTINCT ', ' + c1.col2
          FROM cte c1
          WHERE c.col1 = c1.col1
          FOR XML PATH('')), 1, 1, '') col2
FROM cte c

FÜR XML PATH Direct Application

Eine andere Methode beinhaltet die direkte Anwendung des FOR XML PATH Feature:

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;

Fazit

Die optimale Lösung hängt vom jeweiligen Szenario ab. Die Normalisierung der Daten ist die effizienteste Option. Wenn dies jedoch nicht möglich ist, kann die Verwendung einer benutzerdefinierten Teilungsfunktion oder die direkte Anwendung von FOR XML PATH effiziente Ergebnisse liefern.

Das obige ist der detaillierte Inhalt vonWie kann man durch Kommas getrennte Datenspalten in Datenbanken effizient verknüpfen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn