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

Откуда:
Сообщений: 9
Имеется таблица TBL1 :
FLD1FLD2
1A
1B
2A
2C
3D
3E
4C
4F

Необходимо получить из TBL1 выборку следующего содержания:
FLD3FLD4
1A
1B
1C
1F
2D
2E

Можно ли получить такой результат SQL запросом SELECT или здесь нужны какие-то другие способы?
Направьте, пожалуйста, в каком направлении искать решение?
14 ноя 17, 11:20    [20951820]     Ответить | Цитировать Сообщить модератору
 Re: Select или другое?  [new]
waszkiewicz
Member

Откуда:
Сообщений: 803
sg729,
завязывать с тяжелыми наркотиками. другого решения я не вижу
14 ноя 17, 11:43    [20951983]     Ответить | Цитировать Сообщить модератору
 Re: Select или другое?  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 7651
sg729

Можно ли получить такой результат SQL запросом SELECT...?

Можно.
14 ноя 17, 11:46    [20952001]     Ответить | Цитировать Сообщить модератору
 Re: Select или другое?  [new]
sg729
Member

Откуда:
Сообщений: 9
Спасибо!
14 ноя 17, 13:04    [20952334]     Ответить | Цитировать Сообщить модератору
 Re: Select или другое?  [new]
sg729
Member

Откуда:
Сообщений: 9
Кот Матроскин
sg729
Можно ли получить такой результат SQL запросом SELECT...?

Можно.

Вложенные запросы? Так ведь заранее неизвестно сколько звеньев может быть в цепочке связей по ключу FLD1:
A -> C -> F ... и т.д.
14 ноя 17, 13:23    [20952418]     Ответить | Цитировать Сообщить модератору
 Re: Select или другое?  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2306
Блог
sg729
Кот Матроскин
пропущено...

Можно.

Вложенные запросы? Так ведь заранее неизвестно сколько звеньев может быть в цепочке связей по ключу FLD1:
A -> C -> F ... и т.д.
Вкладывайте. И завязывайте с наркотиками.

А ещё лучше поясните толком что ж вам надо-то? Алгоритм какой?
14 ноя 17, 14:05    [20952630]     Ответить | Цитировать Сообщить модератору
 Re: Select или другое?  [new]
sg729
Member

Откуда:
Сообщений: 9
Павел Воронцов
sg729
пропущено...

Вложенные запросы? Так ведь заранее неизвестно сколько звеньев может быть в цепочке связей по ключу FLD1:
A -> C -> F ... и т.д.
Вкладывайте. И завязывайте с наркотиками.

А ещё лучше поясните толком что ж вам надо-то? Алгоритм какой?

Узнать все связи, например, узла A с другими - и прямые и косвенные (через промежуточные узлы).
P.S.
Наркотики сроду не употреблял -)
14 ноя 17, 14:21    [20952728]     Ответить | Цитировать Сообщить модератору
 Re: Select или другое?  [new]
yah
Member

Откуда: Москва
Сообщений: 106
sg729
Узнать все связи, например, узла A с другими - и прямые и косвенные (через промежуточные узлы).

вот для начала , дайте пожалуйста ,
1. определения понятий "узел" и "Узел X связан с узлом Y"
2. какова связь определенных вами понятий с содержимым таблиц.

sg729
P.S.
Наркотики сроду не употреблял -)

это хорошо... это по-настоящему - без всякого стёба - хорошо...
плохо, что это сразу незаметно.
14 ноя 17, 18:22    [20953819]     Ответить | Цитировать Сообщить модератору
 Re: Select или другое?  [new]
sg729
Member

Откуда:
Сообщений: 9
yah
sg729
Узнать все связи, например, узла A с другими - и прямые и косвенные (через промежуточные узлы).

вот для начала , дайте пожалуйста ,
1. определения понятий "узел" и "Узел X связан с узлом Y"
2. какова связь определенных вами понятий с содержимым таблиц.

Узел - объект, хранящийся в базе данных. Каждый объект имеет уникальный идентификатор "A", "B", "C" и т.д. (для облегчения восприятия сути пишу здесь одной буквой, в действительности там varchar(40). Некоторые объекты (не обязательно все) связаны друг с другом. Связи задаются в таблице TBL1 записями, имеющими одинаковые значения ключевого поля FLD1. Т.е. узел "A" напрямую связан с узлом "B" (через ключ FLD1=1) и с узлом "C" (через ключ FLD1=2). В свою очередь узел "C" напрямую связан с узлом "F" (через ключ FLD1=4). Таким образом косвенно узел "A" связан и с "F" (через "С").
Задача простая - при необходимости выдернуть из TBL1 для конкретного узла (например для "А") идентификаторы всех других узлов прямо или косвенно связанных с заданным (т.е. с "А"). Пробегать по TBL1 сверху вниз - не вариант, поскольку таблица будет содержать несколько десятков (вероятно и сотен) тысяч записей. Возможен ли здесь хитрый Select - говорят да, но я пока не знаю какой. Быть может такая структура таблицы вообще не годится для этой задачи, но лучше придумать не смог.
14 ноя 17, 19:24    [20954027]     Ответить | Цитировать Сообщить модератору
 Re: Select или другое?  [new]
yah
Member

Откуда: Москва
Сообщений: 106
sg729
Быть может такая структура таблицы вообще не годится для этой задачи, но лучше придумать не смог.

ну в общем да... выглядит она странновато, что и породило отдельные комментарии.
на самом деле вы описали отношение эквивалентности на множестве узлов.
есть нехитрая теорема, что ОЭ <=> множество можно разбить на непересекающиеся подмножества, внутри которых элементы эквивалентны, а любые два элемента из разных - нет.
на самом деле у вас кейз - если он точно описан - на построение компонент связности для графа.
для хранения такого рода инфы больше подходит что-то вроде:
 CREATE TABLE Knot_Objects( Knot_Id VARCHAR(40), Group_id INT)
 CREATE TABLE Knot_Links(link_Id INT,  from_Knot_Id VARCHAR(40), to_Knot_Id VARCHAR(40), link_Type int)
 
 INSERT INTO Knot_Objects VALUES ('a', null)
 INSERT INTO Knot_Objects VALUES ('b', null)
 INSERT INTO Knot_Objects VALUES ('c', null)
 INSERT INTO Knot_Objects VALUES ('d', null)
 INSERT INTO Knot_Objects VALUES ('e', null)
 INSERT INTO Knot_Objects VALUES ('f', null)
 
 INSERT INTO Knot_links VALUES (1, 'a', 'b', 0)
 INSERT INTO Knot_links VALUES (2, 'a', 'с', 0)
 INSERT INTO Knot_links VALUES (3, 'd', 'e', 0)
 INSERT INTO Knot_links VALUES (4, 'c', 'f', 0)
 
 SELECT * FROM Knot_Objects AS ko
 SELECT * FROM Knot_Links AS kl

ну и процедурой можно заполнить Group_id
процедура - курсор по Knot_Objects например.
т.е. если ребра графа - не быстро меняющаяся сущность, такой вариант даже желательнее чем любое определение на лету - как бы его не написать.

насчет вопроса
sg729
Возможен ли здесь хитрый Select - говорят да, но я пока не знаю какой.

при определенных дополнительных требованиях к отношению Knot_links, есть в оракле конструкции, позволяющие обходить иерархию, которые можно вкрячить в как-бы селект. но я это плохо знаю.
14 ноя 17, 20:51    [20954228]     Ответить | Цитировать Сообщить модератору
 Re: Select или другое?  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2306
Блог
sg729,

Это поиск по дереву. Ответ сильно зависит от конкретной СУБД, которую вы используете. Общий ответ - это можно сделать с помощью одного запроса, но не всегда это разумно и эффективно. Заявленные десятки тысяч записей могут быть проблемой, а могут и не быть. Настоящей проблемой является само дерево и методы хранения информации о нем. Есть несколько подходов к этому, литературы в сети море. Ищите, адаптируйте.... Указанная Вами схема очевидным образом не соответствует заявленной же задаче использования. Если операция "достать все связи узла" частая и критичная по времени, то придется повозиться. Храните полное дерево, отслеживайте его заполнение с помощью триггеров-процедур и доставайте нужные связи быстро. Если операция редкая и пользователь может подождать - напишите запрос/процедуру для перебора дерева и будет вам счастье.
15 ноя 17, 06:48    [20954687]     Ответить | Цитировать Сообщить модератору
 Re: Select или другое?  [new]
Злой Бобр
Member

Откуда: Украина, Кривой Рог
Сообщений: 3226
waszkiewicz
sg729,
завязывать с тяжелыми наркотиками. другого решения я не вижу

Автора все еще плющит )
15 ноя 17, 10:28    [20954998]     Ответить | Цитировать Сообщить модератору
 Re: Select или другое?  [new]
sg729
Member

Откуда:
Сообщений: 9
yah
множество можно разбить на непересекающиеся подмножества, внутри которых элементы эквивалентны, а любые два элемента из разных - нет

Вот именно это мне и нужно! Вертелось в голове нечто похожее, но никак не мог ухватить суть. Теперь ясно куда грести. Очевидно Вы правы, проще сгенерировать дерево связей и хранить его в базе, модифицируя по мере необходимости. Спасибо! -)
15 ноя 17, 14:36    [20956238]     Ответить | Цитировать Сообщить модератору
 Re: Select или другое?  [new]
sg729
Member

Откуда:
Сообщений: 9
Павел Воронцов
sg729,
Храните полное дерево, отслеживайте его заполнение с помощью триггеров-процедур и доставайте нужные связи быстро.

Пожалуй так и сделаю. Почему-то думал, что при таком подходе для удаления выбранной связи будет трудно реализовать модификацию дерева без его полного перестроения (что заняло бы много времени), но оказалось, что можно найти приемлемое решение.
15 ноя 17, 14:47    [20956299]     Ответить | Цитировать Сообщить модератору
 Re: Select или другое?  [new]
sg729
Member

Откуда:
Сообщений: 9
Злой Бобр
waszkiewicz
sg729,
завязывать с тяжелыми наркотиками. другого решения я не вижу

Автора все еще плющит )

Неужели я похож на сумасшедшего? -) А впрочем, стебитесь на здоровье, смех продлевает жизнь -)
15 ноя 17, 14:54    [20956341]     Ответить | Цитировать Сообщить модератору
 Re: Select или другое?  [new]
yah
Member

Откуда: Москва
Сообщений: 106
sg729
yah
множество можно разбить на непересекающиеся подмножества, внутри которых элементы эквивалентны, а любые два элемента из разных - нет

Вот именно это мне и нужно! Вертелось в голове нечто похожее, но никак не мог ухватить суть. Теперь ясно куда грести. Очевидно Вы правы, проще сгенерировать дерево связей и хранить его в базе, модифицируя по мере необходимости. Спасибо! -)


наслаждайтесь
15 ноя 17, 20:03    [20957820]     Ответить | Цитировать Сообщить модератору
 Re: Select или другое?  [new]
sg729
Member

Откуда:
Сообщений: 9
yah
наслаждайтесь

Премного благодарен! -)
15 ноя 17, 20:38    [20957885]     Ответить | Цитировать Сообщить модератору
 Re: Select или другое?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 33544
sg729
Павел Воронцов
пропущено...
Вкладывайте. И завязывайте с наркотиками.

А ещё лучше поясните толком что ж вам надо-то? Алгоритм какой?

Узнать все связи, например, узла A с другими - и прямые и косвенные (через промежуточные узлы).
P.S.
Наркотики сроду не употреблял -)


ДА ЛАДНО!!!
16 ноя 17, 18:06    [20961176]     Ответить | Цитировать Сообщить модератору
Все форумы / Проектирование БД Ответить