Created
July 9, 2019 11:08
-
-
Save integrer/5b6185a2b03c39c145fd047c178dd8fa to your computer and use it in GitHub Desktop.
Создание связей между дочерними и родительскими записями в иерархическом справочнике
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
USE grnti; | |
GO | |
UPDATE cld | |
SET ParentId = par.Id | |
FROM [dbo].[Categories] as cld | |
left join [dbo].[Categories] as par on | |
( -- Условия для связей 1-2 уровней | |
par.Num2 is null and par.Num3 is null and -- Условия для родительских записей | |
par.Num1 = cld.Num1 and -- Условия совпадения | |
not cld.Num2 is null and cld.Num3 is null -- Условия для дочерних записей | |
) or ( -- Условия для связей 2-3 уровней | |
not par.Num2 is null and par.Num3 is null and -- Условия для родительских записей | |
par.Num1 = cld.Num1 and par.Num2 = cld.Num2 and -- Условия совпадения | |
not cld.Num2 is null and not cld.Num3 is null -- Условия для дочерних записей | |
); | |
/* Пояснения | |
Существует иерархический справочник вида: | |
Id|Num1|Num2|Num3|Caption | |
--+----+----+----+-------------------- | |
1 |01 |null|null|Запись 1-го уровня | |
2 |01 |01 |null|Запись 2-го уровня 1 | |
3 |01 |02 |null|Запись 2-го уровня 2 | |
4 |01 |02 |01 |Запись 3-го уровня | |
Вышеприведенный скрипт связывает элементы 01.01 (Id = 2) и 01.02 (Id = 3) | |
с элементом 01 (Id = 1) и элемент 01.02.01 (Id = 4) с 01.02 (Id = 3) через поле | |
ParentId. После выполнения скрипта вышеприведенная таблица примет следующий вид: | |
Id|ParentId|Num1|Num2|Num3|Caption | |
--+--------+----+----+----+-------------------- | |
1 |null |01 |null|null|Запись 1-го уровня | |
2 |1 |01 |01 |null|Запись 2-го уровня 1 | |
3 |1 |01 |02 |null|Запись 2-го уровня 2 | |
4 |3 |01 |02 |01 |Запись 3-го уровня | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment