Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > PostgreSQL > Хитровыдуманный запрос для таблицы с иерархией |
Автор: polin11 12.4.2019, 11:55 | ||||
Использую СУБД postgresql. Есть иерархическая таблица с каталогами данных (в примере корнями каталогов являются Корень1, Корень2 у них поле parent и root заполнено null) Рабочий пример https://www.db-fiddle.com/f/2hbRo3qUfhwACNHVBxy3A9/0
В каждом каталоге есть папки с датой, в этой папке лежат записи актуальные до указанной даты, у таких папок поле is_node имеет значение false. Нужно написать запрос, который по значению full_code и дате, вернет запись актуальную на указанную дату. Если будет передан полный код корня каталога или полный код записи с папкой, то нужно вернуть актуальную папку с датой. Например: 1) если full_code = 'Корень1.111' Дата = '2017-02-02', то должно вернуться (8, 'Корень1.111', '111', 2, 2, null) 2) если full_code = 'Корень1.111' Дата = '2019-02-02', то должно вернуться из корня запись (5, 'Корень1.111', '111', 1, 1, null) 3) если full_code = 'Корень1.111' Дата = '2012-02-02', то должно ничего не вернут, так как есть папка с датой 2015-12-31 в ней нет записи с кодом 'Корень1.111' 4) если full_code = 'Корень1' Дата = '2017-02-02', то должно вернуться (2, 'Корень1.2017-12-31', '2017-12-31', 1, 1, false) 5) если full_code = 'Корень1' Дата = '2019-02-02', то должно вернуться (1, 'Корень1','Корень1', null, null, true) 6) если full_code = 'Корень1.2017-12-31' Дата = '2019-02-02', то должно вернуться (1, 'Корень1','Корень1', null, null, true) Написал запрос, логика такая узнаем значение id корня каталога, затем строим список из корня и папок с датами, сравниваем с переданной датой, берем актуальную запись с датой, проверяем есть ли там искомый полный код. Но запрос получился слишком сложный:
Вопросы такие: 1) Как упростить запрос? 2) Главный вопрос, как написать запрос, если передан массив полных кодов, и нужно получить массив актуальных записей. Даже нет идей, как решить этот вопрос??? |
Автор: Akina 12.4.2019, 13:20 |
Я верно понимаю, что: 1) Схема - строго двухуровневая? 2) "папки с датой, в этой папке лежат записи актуальные до указанной даты, у таких папок поле is_node имеет значение false" - это всегда второй уровень? |
Автор: polin11 12.4.2019, 13:37 | ||
1) Нет, в папках с датами может быть сколько угодно записей с любым уровнем вложенности. Также в самом корне кроме папок с датами могут быть другие записи (как бы актуальные на текущую дату) 2) У папок с датами всегда уровень 2, родителем таких папок является корень каталога |
Автор: Akina 12.4.2019, 13:51 |
Тогда: 1) JOIN корней с папками-датами. Получаем для каждого корня набор имеющихся дат. 2) JOIN записи с требуемым full_code к своему корню (по full_code LIKE root.code || '%') и отбор записей по не-превышению даты. 3) Получение самой "свежей" записи с помощью FIRST_RECORD() |