ホームページ > データベース > mysql チュートリアル > データベース内のカンマ区切りのデータ列を効率的に結合するにはどうすればよいですか?

データベース内のカンマ区切りのデータ列を効率的に結合するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-12-27 16:07:10
オリジナル
455 人が閲覧しました

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

カンマ区切りデータ列の結合: 詳細なソリューション

データベース システムでは、多くの場合、カンマ区切りで保存されたデータを操作する必要があります。分離された列。データを複数のテーブルに正規化することは理想的な解決策ですが、それが実現できない場合もあります。ここでは、カンマ区切りの列を効率的に結合するためのさまざまな方法を紹介します。

正規化とテーブル結合

データを個別のテーブルに正規化するのが最も効率的な方法です。これには、カンマ区切りの列に一意の値ごとに行を含む新しいテーブルを作成することが含まれます。その後、外部キー関係を使用してテーブルを結合できます。

-- 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)
);
ログイン後にコピー

正規化されると、結合を使用してデータを簡単にクエリできます。

SELECT t2.col1, t1.col2
FROM t2
INNER JOIN t1
  ON t2.col2 = t1.col1
ログイン後にコピー

カスタム分割関数正規化されていないデータ

正規化が不可能な場合は、カスタム分割関数を作成して、カンマ区切りのデータを個々の行に変換します。

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;
ログイン後にコピー

この関数を使用すると、元のテーブルと分割データを結合できます:

;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
ログイン後にコピー

FOR XML PATH Direct Application

もう 1 つの方法では、FOR XML PATH を直接適用します。特徴:

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;
ログイン後にコピー

結論

最適なソリューションは特定のシナリオによって異なります。データを正規化するのが最も効率的なオプションですが、それが不可能な場合は、カスタム分割関数を使用するか、FOR XML PATH を直接適用すると効率的な結果が得られます。

以上がデータベース内のカンマ区切りのデータ列を効率的に結合するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート