创建表6 x 6,上线自动溢出

时间:2018-04-25 23:56:15

标签: sql-server stored-procedures sql-server-2005

我正在为公司MMN创建代码。这个想法是一个有6 x 6表自动溢出的系统。

例如。

我注册了6个新人。

  1. 约翰
  2. 彼得
  3. 玛丽
  4. 拉里
  5. 安德森
  6. 当我注册我的第7个系统时,系统自动按照我下面的顺序进入John网络。当我注册第8个系统时,自动按照我下面的顺序进入Peter网络。

    表6 x 6 第六级:6 第二级:36

    我正在尝试使用sqlserver中的存储过程创建测试。

    当我达到桌子的极限时,我被困在可以自动将新人注册到我下面的部分中。

1 个答案:

答案 0 :(得分:0)

创建矩阵会使数据非规范化。这通常是 NOT 的最佳做法,因为它会使数据操作变得更加困难,以及其他原因。你如何防止行超过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行。如果您这样做,那么您必须一次插入一行的数据,这与SQL Server的所有内容相违背。这将是检查第一列是否完整,然后移动到第二列,然后是第三列等等......它只是没有意义。

相反,我会创建一个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(),特别是Dynamic Pivot。 Stack Overflow上有很多关于如何执行此操作的示例。这也说明了你是否希望矩阵大于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

您可以使用 This OnLine DEMO

查看此操作

Here is some information on normalization