Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Оператор (+) и классические левые объединения..... небольшие траблы / 6 сообщений из 6, страница 1 из 1
28.10.2002, 16:30
    #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
28.10.2002, 16:37
    #32062413
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оператор (+) и классические левые объединения..... небольшие траблы
Для простого понимания символа "+" в запросах, можно использовать слово "расширение". То есть "+" используется для расширения той таблицы в которой нет данных, которые есть в другой. При расширении значения столбцов принимают значения "NULL".
В твоём примере:"...несущствующими записями из b..." - ты должен расширять соответственно алиас b, то есть
b.CB_ACCT_NO(+)
...
Рейтинг: 0 / 0
28.10.2002, 16:38
    #32062414
Василий Алибабаевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оператор (+) и классические левые объединения..... небольшие траблы
Сразу оговорюсь

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

мне нужно в классическом виде a left join b
а она почему то всегда работает как a inner join b
...
Рейтинг: 0 / 0
28.10.2002, 16:49
    #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
28.10.2002, 17:05
    #32062423
Василий Алибабаевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оператор (+) и классические левые объединения..... небольшие траблы
Все вопрос снят .. я действительно тормознул ...... сорри
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Оператор (+) и классические левые объединения..... небольшие траблы / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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