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

アップラインからの自動スピルでテーブル 6 x 6 を作成

    マトリックスを作成すると、データが非正規化されます。通常は、しないことがベスト プラクティスです。 これを行うには、他の理由の中でもとりわけ、データ操作がはるかに困難になるためです。行が 6 を超えないようにするにはどうすればよいでしょうか?次のような奇妙な制約を追加する必要があります:

    create table #matrix ( ID int identity(1,1),
                            Name1 varchar(64),
                            Name2 varchar(64),
                            Name3 varchar(64),
                            Name4 varchar(64),
                            Name5 varchar(64),
                            Name6 varchar(64),
                CONSTRAINT ID_PK PRIMARY KEY (ID),
                CONSTRAINT Configuration_SixRows CHECK (ID <= 6))
    

    あなたはこれをしていないに違いないので、テーブルに挿入される行が 6 行以下であることを「保証」することはできません。これを行っている場合は、一度に 1 行データを挿入する必要があります。 これは、SQL Server のすべてに反します。これは、最初の列が いっぱい かどうかを確認するためのものです それでも、次に 2 番目、3 番目などに移動します...意味がありません。

    代わりに、ParentID を作成します。 あなたの名前をそれぞれのネットワークに関連付ける列 あなたが述べたように。これは、次のような計算列で実行できます:

    declare @table table (ID int identity(1,1), 
                          Names varchar(64), 
                          ParentID as case 
                                         when ID <= 6 then null 
                                         else replace(ID % 6,0,6) 
                                      end)
    
    insert into @table
    values
    ('John')
    ,('Peter')
    ,('Mary')
    ,('Lary')
    ,('Anderson')
    ,('Paul')
    ,('Seven')
    ,('Eight')
    ,('Nine')
    ,('Ten')
    ,('Eleven')
    ,('Twelve')
    ,('Thirteen')
    ,('Fourteen')
    
    
    select * from @table
    

    次に、マトリックスで表示したい場合 PIVOT() を使用します 、特に 動的ピボット .これを行う方法については、スタック オーバーフローに多くの例があります。これは、マトリックスを 6 X N よりも大きくしたい場合にも考慮されます...おそらくネットワークが成長し、各メンバーが 50 個の個体を持ちます...したがって、6 (行) X 51 (列)

    IF 6 列のみ、またはそれ以上ではない場合は、単純な結合ロジックを使用することもできます...

    select
        t.ID
        ,t.Names
        ,t2.Names
        ,t3.Names
    from @table t
    left join
        @table t2 on t2.ParentID = t.ID and t2.ID = t.ID + 6
    left join
        @table t3 on t3.ParentID = t.ID and t3.ID = t.ID + 12
    --continue on
    where
        t.ParentID is null
    

    このオンライン デモ で実際の動作を確認できます。

    正規化に関する情報




    1. (ローカルMySQLインスタンスの代わりに)Javaアプリエンジン開発中にGoogleCloudSQLを使用する

    2. PostgreSQLでの一括/バッチ更新/アップサート

    3. トランザクション用にJPAEntityManagerを開くことができませんでした。ネストされた例外はjavax.persistence.PersistenceExceptionです

    4. MySqlは、行番号が異なる複数のテーブルを結合します