我正在为公司MMN创建代码。这个想法是一个有6 x 6表自动溢出的系统。
例如。
我注册了6个新人。
当我注册我的第7个系统时,系统自动按照我下面的顺序进入John网络。当我注册第8个系统时,自动按照我下面的顺序进入Peter网络。
表6 x 6 第六级:6 第二级:36
我正在尝试使用sqlserver中的存储过程创建测试。
当我达到桌子的极限时,我被困在可以自动将新人注册到我下面的部分中。
答案 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
查看此操作