我正在为MMN公司创建一个代码。这个想法是一个系统,它有一个6x6的自动溢出表。
例如。
我登记了6个新的人。
当我注册我的第七次,系统自动按照我下面的顺序,并投入约翰网络。当我在8号注册时,系统自动跟随我下面的命令,并投入彼得网络。
表6x6一级:6秒级: 36
我试图在sqlserver中创建一个带有存储过程的测试。
当我到达桌子的极限时,我被困在了该如何自动将注册的新人放在我下面的部分。
发布于 2018-04-26 13:39:59
创建一个矩阵将使您的数据去错误化。这样做通常是最好的实践--而不是,因为它使数据操作变得更加困难,还有其他原因。如何防止行超过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行插入到您的表中。如果要执行此操作,则必须每次插入数据一行,这与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()
,特别是动态轴。关于如何做到这一点,有很多关于Stack溢出的例子。这也解释了如果你想要矩阵大于6×N.也许网络在发展,所以每个成员都有50个人.因此,6(行)X 51 (列)
如果只有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
您可以在这个OnLine演示中看到这一点。
https://stackoverflow.com/questions/50032887
复制相似问题