创建矩阵将使您的数据非规范化。通常最好不这样做,因为它使数据操作变得更加困难,以及其他原因。您将如何防止行数超过 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(列)
如果只有 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