|
Хитровыдуманный запрос для таблицы с иерархией
|
|||
---|---|---|---|
#18+
Использую СУБД postgresql. Есть иерархическая таблица с каталогами данных (в примере корнями каталогов являются Корень1, Корень2 у них поле parent и root заполнено null) Рабочий пример https://www.db-fiddle.com/f/omQcctZX4wMvgyXymmNsKL/0 Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
В каждом каталоге есть папки с датой, в этой папке лежат записи актуальные до указанной даты, у таких папок поле 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', то должно ничего не вернут, так как 4) есть папка с датой 2015-12-31 в ней нет записи с кодом 'Корень1.111' 5) если full_code = 'Корень1' Дата = '2017-02-02', то должно вернуться (2, 'Корень1.2017-12-31', '2017-12-31', 1, 1, false) 6) если full_code = 'Корень1' Дата = '2019-02-02', то должно вернуться (1, 'Корень1','Корень1', null, null, true) 7) если full_code = 'Корень1.2017-12-31' Дата = '2019-02-02', то должно вернуться (1, 'Корень1','Корень1', null, null, true) Написал запрос, логика такая узнаем значение id корня каталога, затем строим список из корня и папкок с датами, сравниваем с переданной датой, берем актуальную запись с датой, проверяем есть ли там искомый полный код. Но запрос получился слишком сложный: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
Вопросы такие: 1) Как упростить запрос? 2) Главный вопрос, как написать запрос, если передан массив полных кодов, и нужно получить массив актуальных записей. Даже нет идей, как решить этот вопрос??? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2019, 11:38 |
|
|
start [/forum/topic.php?fid=53&fpage=42&tid=1995244]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
2ms |
others: | 17ms |
total: | 151ms |
0 / 0 |