Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выборка условных данных из двух таблиц / 6 сообщений из 6, страница 1 из 1
07.11.2017, 15:30
    #39549044
Vladimir_S_7178
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка условных данных из двух таблиц
Здравствуйте
Помогите пожалуйста разобраться, борюсь с выводом уникальных полей из одной таблицы с их названием из другой

Есть две таблицы PAYFINPLAN (содержит информацию о всех платежах - десятки тысяч записей), CLASSIFY (расшифровка кодов - тоже несколько тысяч).
Нужно выбрать уникальные коды вида платежа и его наименование
Использую запрос вида:
Код: sql
1.
2.
3.
SELECT DISTINCT CODE8
FROM BUDGET_MASTER.PAYFINPLAN
WHERE ("YEAR" = '2017')


выбираются уникальные коды видов платежей довольно быстро, но когда пытаюсь связать две таблицы то выборка происходит очень медленно в пределах одной минуты.
Код: sql
1.
2.
3.
4.
SELECT DISTINCT PAYFINPLAN.CODE8 AS CODE, CLASSIFY.NAME
FROM BUDGET_MASTER.PAYFINPLAN PAYFINPLAN INNER JOIN
BUDGET_MASTER.CLASSIFY CLASSIFY ON PAYFINPLAN.CODE8 = CLASSIFY.CODE AND PAYFINPLAN."YEAR" = CLASSIFY."YEAR"
WHERE (PAYFINPLAN."YEAR" = '2017') AND (CLASSIFY.TREE = '8')


Думал сделать, что-то наподобие виртуальной таблицы с внесением данных из первого запроса, а затем уже выполнить связку с таблицей наименований, но что-то так и не добился рабочего результата.
Спасибо.
...
Рейтинг: 0 / 0
07.11.2017, 15:52
    #39549063
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка условных данных из двух таблиц
Vladimir_S_7178,

Тут баловаться можно долго:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT DISTINCT CLASSIFY.CODE AS CODE, CLASSIFY.NAME
FROM BUDGET_MASTER.PAYFINPLAN PAYFINPLAN,
         BUDGET_MASTER.CLASSIFY CLASSIFY 
WHERE PAYFINPLAN."YEAR" = '2017'
    AND PAYFINPLAN.CODE8 = CLASSIFY.CODE 
    AND PAYFINPLAN."YEAR" = CLASSIFY."YEAR"
    AND CLASSIFY.TREE = '8'
AND CLASSIFY."YEAR" = '2017'



Код: plsql
1.
2.
3.
4.
5.
SELECT DISTINCT CLASSIFY.CODE AS CODE, CLASSIFY.NAME
FROM BUDGET_MASTER.CLASSIFY CLASSIFY 
WHERE CLASSIFY.TREE = '8'
    AND (CLASSIFY.CODE, CLASSIFY."YEAR") in (select PAYFINPLAN.CODE8, PAYFINPLAN."YEAR" 
                                                                       from BUDGET_MASTER.PAYFINPLAN PAYFINPLAN where PAYFINPLAN."YEAR" = '2017')



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT DISTINCT CLASSIFY.CODE AS CODE, CLASSIFY.NAME
FROM BUDGET_MASTER.CLASSIFY CLASSIFY 
WHERE CLASSIFY.TREE = '8'
    AND exists (select 1 
                        from BUDGET_MASTER.PAYFINPLAN PAYFINPLAN 
                      where PAYFINPLAN."YEAR" = '2017'
                         AND PAYFINPLAN.CODE8 = CLASSIFY.CODE 
                         AND PAYFINPLAN."YEAR" = CLASSIFY."YEAR")



Собирал на коленках, могут быть синтаксические ошибки.
Ну и проверить типы полей относительно передаваемых констант, т.е. поля TREE и "YEAR" должны быть char/varchar что-бы избежать неявного преобразования.
...
Рейтинг: 0 / 0
07.11.2017, 16:49
    #39549095
Vladimir_S_7178
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка условных данных из двух таблиц
MaximaXXL,
не понимаю, почему при использовании
Код: sql
1.
2.
3.
SELECT CLASSIFY.CODE AS CODE, CLASSIFY.NAME
FROM BUDGET_MASTER.CLASSIFY CLASSIFY 
WHERE (CLASSIFY.TREE = '8') AND (CLASSIFY."YEAR"='2017') AND (CLASSIFY.CODE IN (SELECT DISTINCT PAYFINPLAN.CODE8, FROM BUDGET_MASTER.PAYFINPLAN PAYFINPLAN where PAYFINPLAN."YEAR" = '2017'))


вложенный SELECT возвращает все данные из PAYFINPLAN, а не уникальные.
...
Рейтинг: 0 / 0
08.11.2017, 09:22
    #39549354
XMLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка условных данных из двух таблиц
Vladimir_S_7178MaximaXXL,
не понимаю, почему при использовании
Код: sql
1.
2.
3.
SELECT CLASSIFY.CODE AS CODE, CLASSIFY.NAME
FROM BUDGET_MASTER.CLASSIFY CLASSIFY 
WHERE (CLASSIFY.TREE = '8') AND (CLASSIFY."YEAR"='2017') AND (CLASSIFY.CODE IN (SELECT DISTINCT PAYFINPLAN.CODE8, FROM BUDGET_MASTER.PAYFINPLAN PAYFINPLAN where PAYFINPLAN."YEAR" = '2017'))


вложенный SELECT возвращает все данные из PAYFINPLAN, а не уникальные.

Может EXISTS ?
...
Рейтинг: 0 / 0
08.11.2017, 10:53
    #39549414
Vladimir_S_7178
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка условных данных из двух таблиц
XMLer,

C Exists, время выполнения, действительно сократилось до 25 секунд

Код: sql
1.
2.
3.
4.
5.
6.
SELECT CODE, NAME
FROM            BUDGET_MASTER.CLASSIFY CLASSIFY
WHERE        (TREE = '8') AND EXISTS
                             (SELECT        1 AS EXPR1
                               FROM            BUDGET_MASTER.PAYFINPLAN PAYFINPLAN
                               WHERE        ("YEAR" = '2017') AND (CODE8 = CLASSIFY.CODE) AND ("YEAR" = CLASSIFY."YEAR"))
...
Рейтинг: 0 / 0
08.11.2017, 11:12
    #39549428
Vladimir_S_7178
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка условных данных из двух таблиц
MaximaXXL,

Спасибо за примеры, вопрос решился, сократилось время до пары секунд, с этим уже можно работать.

Код: sql
1.
2.
3.
4.
5.
6.
SELECT CODE, NAME
FROM BUDGET_MASTER.CLASSIFY CLASSIFY
WHERE (TREE = '8') AND ("YEAR" = '2017') AND (NAME IS NOT NULL) AND EXISTS
                             (SELECT 1 AS EXPR1
                               FROM BUDGET_MASTER.PAYFINPLAN PAYFINPLAN
                               WHERE ("YEAR" = '2017') AND (CODE8 = CLASSIFY.CODE) AND ("YEAR" = CLASSIFY."YEAR"))
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выборка условных данных из двух таблиц / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]