powered by simpleCommunicator - 2.0.35     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / в MS SQL просто, а в ORACLE как?
2 сообщений из 2, страница 1 из 1
в MS SQL просто, а в ORACLE как?
    #32015835
skif
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Суть такова: выбирается из нескольких таблиц данные. Благодаря тому, что в таблицах данные по конкретному ID могут быть, а могут и не быть, делается избыточное объединение - чтобы попали все строки. При этом каждая строка имеет приоритет, и если у конкретного ID в таблице, к примеру, DOCS, есть пять записей (ну пять паспортов), то должна выбираться та, у которой приоритет выше.

Запрос типа такого:
SELECT O.NAME, O.OBJ_ID, FS.YEARINCOME, FS.YEARTAX, FS.DECLINCOME,
FS.DECLTAX, FS.TAXRETURN, FS.TAXADD, FC.REALTYCNT, FC.FOUNDEDCNT,
FC.DECLCNT, FC.SIGNALCNT, FS.YEAR, FL1.INN, FL1.FAMILY,
FL1.NAME FIRST_NAME, FL1.MIDDLE_NAME, FL1.DATE_BORN, AD1.ADR_STREET,
DC1.DOC_SER, DC1.DOC_NUM, TO_CHAR(FL1.PRIORITY) || ',' ||
TO_CHAR(AD1.PRIORITY) || ',' || TO_CHAR(DC1.PRIORITY) as TOTAL_PRIORITY

FROM REGION.OBJECTS o, KSNP.FL_SUM_DATA FS, KSNP.FL_COUNT_DATA FC,
REGION.FIZ_L FL1, REGION.ADDRESS AD1, REGION.DOCS DC1

WHERE (FS.OBJECT_ID = O.OBJ_ID AND FC.OBJECT_ID = O.OBJ_ID AND
FL1.OBJ_OBJ_ID = O.OBJ_ID AND AD1.OBJ_OBJ_ID (+)= O.OBJ_ID
AND DC1.OBJ_OBJ_ID (+)= O.OBJ_ID) AND ((FS.DECLINCOME > 0))

То есть суть запроса в том, что делается JOIN по всем таблицам (по obj_id) и плюс считается общий приоритет строки, и результат представляется в виде

12 'Иванов' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx '0,1,0'
12 'Иванов' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
12 'ИВанов' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx '123,234,15'

Как сделать теперь так, чтобы в результирующий запрос попали только записи, у которых TOTAL_PRIORITY максимальный? Сделать GROUP BY 'все поля' и MAX(TOTAL_PRIORITY) очень просто, но тупо, так как запрос сажается полностью (число записей в таблицах десятки миллионов), а ORACLE над DISTINCT и GROUP BY готов работать часами
.

Я попробовал так (по крайней мере MS SQL глотает с удовольствием):

SELECT Q1.NAME, Q1.OBJ_ID, Q1.YEARINCOME, Q1.YEARTAX, Q1.DECLINCOME, Q1.DECLTAX, Q1.TAXRETURN,
Q1.TAXADD, Q1.REALTYCNT, Q1.FOUNDEDCNT, Q1.EMPLOYERCNT, Q1.INCOMECNT, Q1.DECLCNT, Q1.SIGNALCNT,
Q1.YEAR, Q1.INN, Q1.FAMILY, Q1.FIRST_NAME, Q1.MIDDLE_NAME, Q1.DATE_BORN, Q1.ADR_STREET,
Q1.ADR_BUILD, Q1.ADR_BLOCK, Q1.ADR_HOUSE, Q1.ADR_FLAT, Q1.DOC_SER, Q1.DOC_NUM

FROM (

SELECT O.NAME, O.OBJ_ID, FS.YEARINCOME, FS.YEARTAX, FS.DECLINCOME, FS.DECLTAX, FS.TAXRETURN,
FS.TAXADD, FC.REALTYCNT, FC.FOUNDEDCNT, FC.EMPLOYERCNT, FC.INCOMECNT, FC.DECLCNT, FC.SIGNALCNT,
FS.YEAR, FL1.INN, FL1.FAMILY, FL1.NAME FIRST_NAME, FL1.MIDDLE_NAME, FL1.DATE_BORN,
AD1.ADR_STREET, DC1.DOC_SER, DC1.DOC_NUM, TO_CHAR(FL1.PRIORITY) || ',' || TO_CHAR(AD1.PRIORITY)
|| ',' || TO_CHAR(DC1.PRIORITY) as TOTAL_PRIORITY

FROM REGION.OBJECTS o, KSNP.FL_SUM_DATA FS, KSNP.FL_COUNT_DATA FC,
REGION.FIZ_L FL1, REGION.ADDRESS AD1, REGION.DOCS DC1

WHERE (FS.OBJECT_ID = O.OBJ_ID AND FC.OBJECT_ID = O.OBJ_ID AND FL1.OBJ_OBJ_ID = O.OBJ_ID
AND AD1.OBJ_OBJ_ID (+)= O.OBJ_ID AND DC1.OBJ_OBJ_ID (+)= O.OBJ_ID) AND ((FS.DECLINCOME > 0))
) Q1,

( SELECT O.OBJ_ID, TO_CHAR(FL1.PRIORITY) || ',' || TO_CHAR(AD1.PRIORITY) ||
',' || TO_CHAR(DC1.PRIORITY) as TOTAL_PRIORITY

FROM REGION.OBJECTS o, KSNP.FL_SUM_DATA FS, KSNP.FL_COUNT_DATA FC,
REGION.FIZ_L FL1, REGION.ADDRESS AD1, REGION.DOCS DC1

WHERE (FS.OBJECT_ID = O.OBJ_ID AND FC.OBJECT_ID = O.OBJ_ID AND FL1.OBJ_OBJ_ID = O.OBJ_ID
AND AD1.OBJ_OBJ_ID (+)= O.OBJ_ID AND DC1.OBJ_OBJ_ID (+)= O.OBJ_ID) AND ((FS.DECLINCOME > 0))

) Q2

WHERE Q1.TOTAL_PRIORITY = (SELECT MAX(Q2.TOTAL_PRIORITY) FROM Q2 WHERE Q2.obj_id = Q1.OBJ_ID)

но оказалось, что ORACLE второго SQL-выражения в поле WHERE вместо таблицы не принимает.
И что делать? Я понимаю, что можно сделать процедуру, сначала выбрать все в одну таблицу, потом во вторую, потом их объединить и получить искомое. Но представьте себе, что я должен обучить программу генерить такие запросы... То есть все прочие варианты отпадают
.
...
Рейтинг: 0 / 0
в MS SQL просто, а в ORACLE как?
    #32015869
skif
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, додумался, вопрос снят.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / в MS SQL просто, а в ORACLE как?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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