|
Помогите найти ошибку в запросе новичку
|
|||
---|---|---|---|
#18+
Добрый день! Есть функция, которая разбивает месяц на периоды, функция учитывает количество дней в каждом месяце, учитывая высокосный год и возвращает следующий набор записей. Код: plsql 1.
date_perioddescrdayfirstdaylastlimitfordaylast01.10.17 - 01.10.17Начало месяца01.10.201701.10.201702.10.201702.10.17 - 08.10.17Первая полная неделя02.10.201708.10.201709.10.201709.10.17 - 15.10.17Вторая полная неделя09.10.201715.10.201716.10.201716.10.17 - 22.10.17Третья полная неделя16.10.201722.10.201723.10.201723.10.17 - 29.10.17Четвертая полная неделя23.10.201729.10.201730.10.201730.10.17 - 31.10.17Окончание месяца30.10.201731.10.201701.11.2017 Нужно привязать к данным периодам определенные вычисления, количество суммы и т.д., если данные отсутствуют, то периоды, для которых данные отсутсвуют должны иметь значение NULL или 0. Написал запрос (в реальном запросе будет задействовано больше связанных таблиц.... здесь приведен пример только с вычислением количества): Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Получил результат: date_perioddescrkol01.10.17 - 01.10.17Начало месяца1502.10.17 - 08.10.17Первая полная неделя68709.10.17 - 15.10.17Вторая полная неделя77016.10.17 - 22.10.17Третья полная неделя68323.10.17 - 29.10.17Четвертая полная неделя405 А должен получить: date_perioddescrkol01.10.17 - 01.10.17Начало месяца1502.10.17 - 08.10.17Первая полная неделя68709.10.17 - 15.10.17Вторая полная неделя77016.10.17 - 22.10.17Третья полная неделя68323.10.17 - 29.10.17Четвертая полная неделя40530.10.17 - 31.10.17Окончание месяцаNULL или: date_perioddescrkol01.10.17 - 01.10.17Начало месяца1502.10.17 - 08.10.17Первая полная неделя68709.10.17 - 15.10.17Вторая полная неделя77016.10.17 - 22.10.17Третья полная неделя68323.10.17 - 29.10.17Четвертая полная неделя40530.10.17 - 31.10.17Окончание месяца0 Уважаемые форумчане помогите пожалуйста. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 12:04 |
|
Помогите найти ошибку в запросе новичку
|
|||
---|---|---|---|
#18+
Alex_Stroma, Вы условием WHERE qc.project_id = '00000000000lrqse6' превратили LEFT JOIN в INNER. Вам это условие в кляузе ON нужно указывать. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 12:23 |
|
Помогите найти ошибку в запросе новичку
|
|||
---|---|---|---|
#18+
Alex_Stroma, В целях общего развития и понимания происходящего: ссылка Не обращайте внимания, что ссылки на другие сервера (Oracle, MySQL, MS SQL). Это больше имеет отношение к ANSI SQL, поэтому справедливо для любого ANSI-совместимого сервера СУБД ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 12:28 |
|
Помогите найти ошибку в запросе новичку
|
|||
---|---|---|---|
#18+
Щукина Анна, В условии where qc.project_id = '00000000000lrqse6' значение будет меняться динамически, это постоянное условие. Выше я писал, что в реалии связанных таблиц будет больше. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 12:31 |
|
Помогите найти ошибку в запросе новичку
|
|||
---|---|---|---|
#18+
Alex_Stroma, и вам еще раз - вы своим условием преобразуете LEFT JOIN в INNER. Это основа логики ANSI-джойнов. Предикаты меняют свою смысловую нагрузку в зависимости от того, в какой части запроса они указаны. Для inner-соединений место указания предиката не играет никакой роли на итоговую логику запроса и выбираемые им данные. В OUTER-соединениях (в любых - LEFT, RIGHT, FULL) местоположение предиката в кляузе ON или WHERE меняет семантический его смысл. С пре-джой на пост-джойн. ... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 12:41 |
|
Помогите найти ошибку в запросе новичку
|
|||
---|---|---|---|
#18+
Щукина Анна, Анна, я уже это понял.... Вопрос в другом, еще будет присоединяться не менее 4-х таблиц и придется использовать условие where в любом случае.... Запрос как-то можно изменить или придется все условия указывать в ....ON (........) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 12:54 |
|
Помогите найти ошибку в запросе новичку
|
|||
---|---|---|---|
#18+
Alex_Stroma, для предварительной фильтрации соединяемых наборов данных используйте встроенные представления (inline-views, derived table, select from select, etc.) Ну или на примере вашего же изначального запроса: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 13:03 |
|
Помогите найти ошибку в запросе новичку
|
|||
---|---|---|---|
#18+
Щукина Анна, Анна, спасибо Вам большое за содержательный ответ. Еще один вопрос, а конструкцию with..... as ...(....), ...as..., В данном случае можно применить? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 13:42 |
|
Помогите найти ошибку в запросе новичку
|
|||
---|---|---|---|
#18+
Alex_Stroma, Можно и with. В данном случае, скорее всего, это синтаксический рафинад и разницы никакой не будет. Но планы для полной уверенности посмотреть не помешает. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 14:40 |
|
Помогите найти ошибку в запросе новичку
|
|||
---|---|---|---|
#18+
Щукина Анна, Анна, спасибо большое за помощь! Разобрался, тестовый запрос прошел успешно. Реализовал с with, т.к. более понятно получается что и где отсекать, т.к. задействовано еще +5 таблиц, в которых необходимо отфильтровывать данные по условиям. Еще раз большое спасибо за помощь! ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 14:55 |
|
Помогите найти ошибку в запросе новичку
|
|||
---|---|---|---|
#18+
Щукина АннаМожно и with. В данном случае, скорее всего, это синтаксический рафинад CTE в postgresql материализуется. Поэтому разница может быть и может быть весьма значительная (как в одну так и в другую стороны). ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 16:18 |
|
|
start [/forum/topic.php?fid=53&msg=39542340&tid=1996148]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
others: | 19ms |
total: | 148ms |
0 / 0 |