Skip to content

Instantly share code, notes, and snippets.

@integrer
Created July 9, 2019 11:08
Show Gist options
  • Save integrer/5b6185a2b03c39c145fd047c178dd8fa to your computer and use it in GitHub Desktop.
Save integrer/5b6185a2b03c39c145fd047c178dd8fa to your computer and use it in GitHub Desktop.
Создание связей между дочерними и родительскими записями в иерархическом справочнике
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