sql >> データベース >  >> RDS >> Sqlserver

テーブルの正規化 (カンマ区切りのフィールドを個々のレコードに解析)

    -- セットアップ:

    declare @Device table(DeviceId int primary key, Parts varchar(1000))
    declare @Part table(PartId int identity(1,1) primary key, PartName varchar(100))
    declare @DevicePart table(DeviceId int, PartId int)
    
    insert @Device
    values
        (1, 'Part1, Part2, Part3'),
        (2, 'Part2, Part3, Part4'),
        (3, 'Part1')
    

    --スクリプト:

    declare @DevicePartTemp table(DeviceId int, PartName varchar(100))
    
    insert @DevicePartTemp
    select DeviceId, ltrim(x.value('.', 'varchar(100)'))
    from
    (
        select DeviceId, cast('<x>' + replace(Parts, ',', '</x><x>') + '</x>' as xml) XmlColumn
        from @Device
    )tt
    cross apply
        XmlColumn.nodes('x') as Nodes(x)
    
    
    insert @Part
    select distinct PartName
    from @DevicePartTemp
    
    insert @DevicePart
    select tmp.DeviceId, prt.PartId
    from @DevicePartTemp tmp 
        join @Part prt on
            prt.PartName = tmp.PartName
    

    -- 結果:

    select *
    from @Part
    
    PartId      PartName
    ----------- ---------
    1           Part1
    2           Part2
    3           Part3
    4           Part4
    
    
    select *
    from @DevicePart
    
    DeviceId    PartId
    ----------- -----------
    1           1
    1           2
    1           3
    2           2
    2           3
    2           4
    3           1   
    


    1. MySqlWorkbenchのlocal-infileオプションに接続する

    2. トリガー:テーブルの値を別のテーブルの値で初期化するにはどうすればよいですか?

    3. SQLでGROUPBYが選択するレコード

    4. SonarQubeを4.5.2から5.0にアップグレードできませんでした