Создать таблицу 6 х 6 с автоматическим разливом из верхней линии - PullRequest
0 голосов
/ 26 апреля 2018

Я создаю код для компании MMN.По идее система с таблицей 6 x 6 с автоматическим разливом.

Например.

Я регистрирую 6 новых людей.

  1. Джон
  2. Питер
  3. Мэри
  4. Лари
  5. Андерсон
  6. Пол

Когда я регистрирую свой 7-й, система автоматически следуетпорядок ниже меня и положить в сеть Джона.Когда я регистрирую восьмое, система автоматически следует порядку ниже меня и помещает в сеть Питера.

Таблица 6 x 6 Уровень рубашки: 6 Второй уровень: 36

Я пытаюсь создать тестс хранимой процедурой в sqlserver.

Я застрял в части, как я могу автоматически поставить нового зарегистрированного человека ниже меня, когда я достигну предела таблицы.

1 Ответ

0 голосов
/ 26 апреля 2018

Создание матрицы приведет к денормализации ваших данных.Обычно это лучше всего делать НЕ , так как это усложняет манипулирование данными, в том числе и по другим причинам.Как бы вы помешали строкам быть больше 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

Вы можете увидеть это в действии с Это OnLine DEMO

Вот некоторая информация о нормализации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...