Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выбор простейшего элемента во вложенной структуре  [new]
StreamCX
Member

Откуда:
Сообщений: 43
Есть таблица t1 с полями ID и Name.
Есть другая таблица t2 — в ней поля Aggregate_ID и Element_ID.
Aggregate_ID Element_ID из t2 связаны с ID из x1

x1:
ID и Name
1 Машина
2 капот
3 двигатель
4 цилиндры
5 колесо
6 шина
7 обод
8 крепление обода

x2:
Aggregate_ID Element_ID
1 2
1 3
1 4
1 5
3 4
5 6
5 7
7 8

Нужно выбрать элементы, которые являются простейшими в данной таблице. Сейчас это 2, 4 и 7
Но сложность таблицы может быть увеличена.
Как это сделать?
12 окт 13, 11:24    [14960140]     Ответить | Цитировать Сообщить модератору
 Re: Выбор простейшего элемента во вложенной структуре  [new]
StreamCX
Member

Откуда:
Сообщений: 43
StreamCX,

2, 4, 8 — это простейшие элементы.
Добавлю, что выбрать то могу, но нужно учесть, что таблица увеличится, и не разобрался пока, как сделать это рекурсивно.
12 окт 13, 11:46    [14960157]     Ответить | Цитировать Сообщить модератору
 Re: Выбор простейшего элемента во вложенной структуре  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31429
StreamCX
Добавлю, что выбрать то могу, но нужно учесть, что таблица увеличится, и не разобрался пока, как сделать это рекурсивно.
Какая ещё рекурсия???

Нужно выбрать все записи из t1, ИД которых нет в поле Aggregate_ID таблицы t2

Используйте NOT EXISTS
12 окт 13, 12:02    [14960184]     Ответить | Цитировать Сообщить модератору
 Re: Выбор простейшего элемента во вложенной структуре  [new]
StreamCX
Member

Откуда:
Сообщений: 43
В данном случае я это уже сделал, это очень просто.
Но что, если элемент состоит из многих элементов, которые в свою очередь состоят еще из многих и т.д?
12 окт 13, 12:06    [14960192]     Ответить | Цитировать Сообщить модератору
 Re: Выбор простейшего элемента во вложенной структуре  [new]
StreamCX
Member

Откуда:
Сообщений: 43
Более общее решение, без рекурсии.
SELECT DISTINCT Element_ID
FROM T2
EXCEPT
SELECT DISTINCT Aggregate_ID
FROM T2
12 окт 13, 12:19    [14960215]     Ответить | Цитировать Сообщить модератору
 Re: Выбор простейшего элемента во вложенной структуре  [new]
StreamCX
Member

Откуда:
Сообщений: 43
SELECT ID FROM T1 WHERE T1.ID NOT IN (SELECT Aggregate_ID FROM T2)
12 окт 13, 12:50    [14960243]     Ответить | Цитировать Сообщить модератору
 Re: Выбор простейшего элемента во вложенной структуре  [new]
StreamCX
Member

Откуда:
Сообщений: 43
Возникает более интересный вопрос.
Как выбрать все простейшие элементы для аггрегата?
12 окт 13, 14:01    [14960421]     Ответить | Цитировать Сообщить модератору
 Re: Выбор простейшего элемента во вложенной структуре  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31429
StreamCX
В данном случае я это уже сделал, это очень просто.
Но что, если элемент состоит из многих элементов, которые в свою очередь состоят еще из многих и т.д?
Так задача какая? "Выбрать все простейшие элементы". Тут неважно, что из чего состоит - нужно выбрать те элементы, которые не являются ни для кого предком, то есть простой NOT EXISTS (или, как вариант, LEFT JOIN и IS NULL)
StreamCX
Возникает более интересный вопрос.
Как выбрать все простейшие элементы для аггрегата?
А вот это уже намного более сложная задача, решается только циклом по уровням (или рекурсией, если человек совсем ноль в СУБД)

Цикл по уровням можно сделать или явно, с временной табличкой, или используя конструкцию CTE.

Поищите по этому форуму по слову "дерево", тут есть целая куча вариантов, или посмотрите в ФАКе
12 окт 13, 14:52    [14960588]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить