Форум программистов, компьютерный форум, киберфорум
Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
1 / 1 / 0
Регистрация: 10.12.2020
Сообщений: 12
1

Успростить запрос

14.02.2021, 20:10. Показов 1742. Ответов 5

Author24 — интернет-сервис помощи студентам
Всем привет
Есть такой запрос:
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
        SELECT id, created_at, updated_at, details, formatted_address, place_id, ptype FROM (
            SELECT :projection,
            CASE WHEN EXISTS(
                SELECT task.id
                FROM task
                LEFT JOIN property_task ON property_task.task_id = task.id
                LEFT JOIN property ON property.id = property_task.property_id
                LEFT JOIN contact_task ON contact_task.task_id = task.id
                LEFT JOIN contact ON contact.id = contact_task.contact_id
                LEFT JOIN "user" ON "user".id = task.owner_id
                LEFT JOIN user_group ON user_group.user_id = "user".id
                WHERE task.owner_id = {$userId}
                AND "user".id = user_group.user_id
                AND user_group.group_id = {$groupId}
                AND (contact.address_id = address.id OR property.address_id = address.id)
                AND task_type_id IN (4, 5, 6, 7)
                AND task.status = 'remind'
                AND date_trunc('day', task.tasked_at) <= date_trunc('day', NOW())
            ) THEN 'remind' ELSE 'null' END AS ptype,
            (details::json#>>'{location,latitude}') AS latitude,
            (details::json#>>'{location,longitude}') AS longitude
            FROM address
            WHERE point( (details::json#>>'{location,longitude}')::DOUBLE PRECISION , (details::json#>>'{location,latitude}')::DOUBLE PRECISION)<@polygon('({$string})')
            ) AS addresses
        WHERE addresses.ptype != 'null'
этот запрос возращает 2 записи

мне нужно его упростить. И я пробывал так:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        SELECT :projection,
        (details::json#>>'{location,latitude}') AS latitude,
        (details::json#>>'{location,longitude}') AS longitude
        FROM address
        LEFT JOIN "user" ON address.user_id = "user".id
        LEFT JOIN user_group ON user_group.user_id = "user".id
        LEFT JOIN task ON "user"."id" = "task"."owner_id"
        LEFT JOIN property_task ON property_task.task_id = task.id
        LEFT JOIN property ON property.id = property_task.property_id
        LEFT JOIN contact_task ON contact_task.task_id = task.id
        LEFT JOIN contact ON contact.id = contact_task.contact_id
        WHERE point( (details::json#>>'{location,longitude}')::DOUBLE PRECISION , (details::json#>>'{location,latitude}')::DOUBLE PRECISION)<@polygon('({$string})')
        AND task.owner_id = {$userId}
        AND "user".id = user_group.user_id
        AND user_group.group_id = {$groupId}
        AND (contact.address_id = address.id OR property.address_id = address.id)
        AND task_type_id IN (4, 5, 6, 7)
        AND task.status = 'remind'
        AND date_trunc('day', task.tasked_at) <= date_trunc('day', NOW())
этот запрос возращает 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
            SELECT :projection,
            CASE WHEN EXISTS(
                SELECT task.id
                FROM task
                LEFT JOIN property_task ON property_task.task_id = task.id
                LEFT JOIN property ON property.id = property_task.property_id
                LEFT JOIN contact_task ON contact_task.task_id = task.id
                LEFT JOIN contact ON contact.id = contact_task.contact_id
                LEFT JOIN "user" ON "user".id = task.owner_id
                LEFT JOIN user_group ON user_group.user_id = "user".id
                WHERE task.owner_id = {$userId}
                AND "user".id = user_group.user_id
                AND user_group.group_id = {$groupId}
                AND (contact.address_id = address.id OR property.address_id = address.id)
                AND task_type_id IN (4, 5, 6, 7)
                AND task.status = 'remind'
                AND date_trunc('day', task.tasked_at) <= date_trunc('day', NOW())
            ) THEN 'remind' ELSE 'null' END AS ptype,
            (details::json#>>'{location,latitude}') AS latitude,
            (details::json#>>'{location,longitude}') AS longitude
            FROM address
            WHERE point( (details::json#>>'{location,longitude}')::DOUBLE PRECISION , (details::json#>>'{location,latitude}')::DOUBLE PRECISION)<@polygon('({$string})')
            HAVING address.ptype != 'null'
В этом запросе жалуется на ptype мол нет такого column, я понимаю причину, но убрав ptype мне вернется целый список с ptype null и remind(которых ток 2 записи) и я не понимаю как можно отфильтровать null значения не добавляя subquery.

Какие советы можете дать или может подсказать что?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.02.2021, 20:10
Ответы с готовыми решениями:

Как посмотреть T-SQL запрос который генерирует Entity Framework запрос
как посмотреть T-SQL запрос который генерирует Entity Framework запрос в visual studio 2010, 2012

На одном сервере запрос выполняется 1 сек, на другом этот же запрос - 80 секунд
Добрый день! Есть большущий запрос для формирования отчёта, где-то около 22 джоинов, сам запрос не...

Запрос Select T-sql - Вложенный запрос вернул больше одного значения
Нужно посчитать комиссию от сделки. DealShare(комиссия) - поле таблицы agents, supplies -...

Есть запрос на вставку в PostgreSQL нужно написать этот запрос в Python
Есть запрос на вставку в PostgreSQL нужно написать этот запрос в Python INSERT INTO &quot;table1&quot;...

5
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,130
Записей в блоге: 3
14.02.2021, 22:43 2
Цитата Сообщение от Levaz Посмотреть сообщение
мне нужно его упростить
что значит "упростить"?
по времени? по строкам? по результату?

укажите хотя бы СУБД
0
1 / 1 / 0
Регистрация: 10.12.2020
Сообщений: 12
14.02.2021, 22:58  [ТС] 3
В целом я могу не фильтровать по EXISTS() но тогда
Цитата Сообщение от qwertehok Посмотреть сообщение
что значит "упростить"?
по времени? по строкам? по результату?
укажите хотя бы СУБД
Простите за неясность . СУБД PostgreSQL + POMM(это то что касается : projection ). Нужно ускорить запрос избавившись от subquery или например перебора всей таблицы task через exist() . Тот вариант который возращает 0 записей по идее подходит и умом я это понимаю, но результата нет....
Кстати expert analyze не вариант ибо (location,latitude) и (location,longitude) geo метки и их попросту нет в таблице , не могу сказать точно как ни обрабатываются.
По этому я и сконцентрировался на том что бы сделать что-то с гарантированным результатом.

Вы же в свою очередь можете предложить абсолютно любые варианты которые по вашему мнению могут помочь мне с поиском решения.
В любом случае спасибо за фидбэк))
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,130
Записей в блоге: 3
14.02.2021, 23:14 4
а заранее рассчитать то что в подзапросе нельзя?
1
1 / 1 / 0
Регистрация: 10.12.2020
Сообщений: 12
14.02.2021, 23:30  [ТС] 5
Цитата Сообщение от qwertehok Посмотреть сообщение
а заранее рассчитать то что в подзапросе нельзя?
Умная мысль)) В остатке нужно выяснить причину отсутствия данных при том же наборе условий
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,130
Записей в блоге: 3
14.02.2021, 23:42 6
Лучший ответ Сообщение было отмечено Levaz как решение

Решение

Цитата Сообщение от Levaz Посмотреть сообщение
В остатке нужно выяснить причину отсутствия данных при том же наборе условий
комментируешь по 1 условию и проверяешь
у вас запрос маленький
1
14.02.2021, 23:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.02.2021, 23:42
Помогаю со студенческими работами здесь

Почему ответ на GET запрос из Python отличается от ответа на GET запрос из HTTP Analyzer
Добрый день. Делаю GET запрос из HTTP Analyzer Указываю только адрес запроса:...

Укомплектовать запрос в один. Запрос маленький проблема для знающего на 30 сек
Всем привет. Возможно кому то для поднятия настроения. Как укомплектовать такой запрос в один ...

Как записать запрос так чтобы их запрос суммировался в одну ячейку?
Как записать этот запрос так чтобы их запрос суммировался в одну ячейку? Перепробовал все что знал...

Как в Delphi сделать запрос на запрос, база mssql, BDE
Добрый день! Кто-нибудь может подсказать, как можно Tquery и использовать как таблицу, при...

Как в sql запрос вставить еще один запрос правильно?
Есть длинный запрос, в котором можете даже не разбираться если не хотите, но выдает он следующее:...

Запрос таблицам и их атрибутам, или запрос хочу то не знаю что
Доброго времени суток, база данных содержит неизвестное количество таблиц, у этих таблиц...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru