powered by simpleCommunicator - 2.0.44     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Оператор (+) и классические левые объединения..... небольшие траблы
6 сообщений из 6, страница 1 из 1
Оператор (+) и классические левые объединения..... небольшие траблы
    #32062410
Василий Алибабаевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветсвую Всех!
вы уж простите мне мою глупость, но я замкнул на одном запросе, и никак не могу понять в чем дело.

Итак :
Существуют таблицы a,b и c. Необходимо сделать a (inner join c) left join b

БД большая и при запросе за определенный период должно вылезти 2700 записи из а причем 1000 из них должны объедениться с пустотой (несущствующими записями из b)

Пишем запрос на Оракуле:
Код: plaintext
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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
SELECT 
 a. "TRAN_KEY" ,
 a. "BRANCH" ,
 a. "CB_GL_CODE" ,
 a. "GL_CODE" ,
 a. "CB_ACCT_NO" ,
 a.ACCT_DESC,
 a.CLIENT_NO,
 a.DEPARTMENT,
 a.ACCT_EXEC,
 a.CCY,
 a. "SEQ_NO" ,
 a. "PROFIT_CENTRE" ,
 a. "SOURCE_MODULE" ,
 a. "SOURCE_TYPE" ,
 a. "TRADE_NO" ,
 a. "REFERENCE" ,
 b.ACCT_DESC REF_DESC, 
 b.GL_CODE REF_GL_CODE,
 b.CB_GL_CODE REF_CB_GL_CODE,
 b.CCY REF_CCY,
 b.CLIENT_NO REF_CLIENT_NO,
 b.DEPARTMENT REF_DEPARTMENT,
 a. "POST_DATE" ,
 a. "VALUE_DATE" ,
 a. "NARRATIVE" ,
 -a. "AMOUNT"  AMOUNT,
c.CENTRAL_BANK_RATE,
-a. "AMOUNT"  * c.CENTRAL_BANK_RATE LCY_AMOUNT,
 a. "REVERSAL" ,
 a. "STATUS" ,
 a. "EXCH_RATE" ,
 a. "LCY_EQIV" ,
 a. "PROD_SUB_TYPE" ,
 a. "INTERNAL_KEY" ,
 a. "TRAN_COMMENT"  
FROM 
GL_POST_HIST_V@SYMBOLS.IMPEX.RU a,
FM_CCY_HIST@SYMBOLS.IMPEX.RU c,
GL_ACCT@SYMBOLS.IMPEX.RU b
WHERE a.CCY=c.CCY AND a.VALUE_DATE=c.EFFECTIVE_DATE AND a.REFERENCE(+) =b.CB_ACCT_NO


результат - 1700 строк - явное проглатывание некоторых строк таблицы а которых нет в b

пишем другой запрос :
Код: plaintext
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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
SELECT 
 a. "TRAN_KEY" ,
 a. "BRANCH" ,
 a. "CB_GL_CODE" ,
 a. "GL_CODE" ,
 a. "CB_ACCT_NO" ,
 a.ACCT_DESC,
 a.CLIENT_NO,
 a.DEPARTMENT,
 a.ACCT_EXEC,
 a.CCY,
 a. "SEQ_NO" ,
 a. "PROFIT_CENTRE" ,
 a. "SOURCE_MODULE" ,
 a. "SOURCE_TYPE" ,
 a. "TRADE_NO" ,
 a. "REFERENCE" ,
 b.ACCT_DESC REF_DESC, 
 b.GL_CODE REF_GL_CODE,
 b.CB_GL_CODE REF_CB_GL_CODE,
 b.CCY REF_CCY,
 b.CLIENT_NO REF_CLIENT_NO,
 b.DEPARTMENT REF_DEPARTMENT,
 a. "POST_DATE" ,
 a. "VALUE_DATE" ,
 a. "NARRATIVE" ,
 -a. "AMOUNT"  AMOUNT,
c.CENTRAL_BANK_RATE,
-a. "AMOUNT"  * c.CENTRAL_BANK_RATE LCY_AMOUNT,
 a. "REVERSAL" ,
 a. "STATUS" ,
 a. "EXCH_RATE" ,
 a. "LCY_EQIV" ,
 a. "PROD_SUB_TYPE" ,
 a. "INTERNAL_KEY" ,
 a. "TRAN_COMMENT"  
FROM 
(GL_POST_HIST_V@SYMBOLS.IMPEX.RU a inner join
FM_CCY_HIST@SYMBOLS.IMPEX.RU c on (a.CCY=c.CCY AND a.VALUE_DATE=c.EFFECTIVE_DATE)) 
left join GL_ACCT@SYMBOLS.IMPEX.RU b on (a.REFERENCE=b.CB_ACCT_NO)

Все работает как надо, результат - 2700 записи
Но при этом жутко тормозит.

В чем трабл? Почему в первом случае не получается ...... Может я чего то недопонимаю
...
Рейтинг: 0 / 0
Оператор (+) и классические левые объединения..... небольшие траблы
    #32062413
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для простого понимания символа "+" в запросах, можно использовать слово "расширение". То есть "+" используется для расширения той таблицы в которой нет данных, которые есть в другой. При расширении значения столбцов принимают значения "NULL".
В твоём примере:"...несущствующими записями из b..." - ты должен расширять соответственно алиас b, то есть
b.CB_ACCT_NO(+)
...
Рейтинг: 0 / 0
Оператор (+) и классические левые объединения..... небольшие траблы
    #32062414
Василий Алибабаевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сразу оговорюсь

SELECT * from a,b where a.ROW_KEY(+)=b.FOREIGN_KEY также не объединяет и работает как inner join ...... даже без с
...
Рейтинг: 0 / 0
Оператор (+) и классические левые объединения..... небольшие траблы
    #32062416
Василий Алибабаевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще раз: базовое множество - a, расширение множества a - множество b

мне нужно в классическом виде a left join b
а она почему то всегда работает как a inner join b
...
Рейтинг: 0 / 0
Оператор (+) и классические левые объединения..... небольшие траблы
    #32062418
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже тебя и вправду замкнуло.
Ты писал "из них должны объедениться с пустотой (несущствующими записями из b) "???

Обьясняю еще раз, для того что-бы алиас b вернул еще 1000 записей с пустотой, как ты сказал., правильнее говоря с NULL - необходимо знак (+) поставить для алиаса b, т.е :

WHERE
a.CCY=c.CCY AND
a.VALUE_DATE=c.EFFECTIVE_DATE AND
a.REFERENCE =b.CB_ACCT_NO(+)
...
Рейтинг: 0 / 0
Оператор (+) и классические левые объединения..... небольшие траблы
    #32062423
Василий Алибабаевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все вопрос снят .. я действительно тормознул ...... сорри
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Оператор (+) и классические левые объединения..... небольшие траблы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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