|
в MS SQL просто, а в ORACLE как?
|
|||
---|---|---|---|
#18+
Суть такова: выбирается из нескольких таблиц данные. Благодаря тому, что в таблицах данные по конкретному 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 вместо таблицы не принимает. И что делать? Я понимаю, что можно сделать процедуру, сначала выбрать все в одну таблицу, потом во вторую, потом их объединить и получить искомое. Но представьте себе, что я должен обучить программу генерить такие запросы... То есть все прочие варианты отпадают . ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2001, 15:56 |
|
|
start [/forum/topic.php?fid=52&msg=32015869&tid=1993504]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
44ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
others: | 258ms |
total: | 367ms |
0 / 0 |