powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / OUTER JOIN через (+)=
4 сообщений из 4, страница 1 из 1
OUTER JOIN через (+)=
    #32026866
skif
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извините, что не в группу, но форум ORACLE мертвый, а здесь обитают спецы широкого профиля....

Синтаксис ORACLE 8.1.7.

Есть таблица физических лиц FIZ_L

OBJ_ID_ID FIZ_L_ID FAMILY
1 1 Иванов
1 2 Иванов
2 3 Иванов


Есть таблица S_I_FIZ_L, которая связана с таблицей FIZ_L по ключам и содержит дополнительную информацию, как то ссылку на источник, дату вставки записи etc.
FIZ_L_ID_ID DATE_INS SOURCE_T_ID_ID some fields
1 01.01.2000 2
2 05.01.2000 3
3 01.01.1980 1

Есть таблица адресов ADDRESS
OBJ_ID_ID ADDRESS_ID INDEX COUNTRY .......
1 1 6456 4566

Есть таблица S_I_ADDRESS, которая содержит также служебную информацию и связана с ADDRESS
ADDRESS_ID_ID DATE_INS SOURCE_T_ID_ID
1 01.01.1990 4

То есть общая логика такая: первичные таблицы (как то FIZ_L, ADDRESS) связаны между собой по первичным ключам OBJ_ID_ID. каждая из служебных связана с базовой S_I_FIZ_L.FIZ_L_ID_ID = FIZ_L.FIZ_L_ID и адреса таким же макаром, притом FIZ_L_ID уникален, для каждой записи в базовой таблице FIZ_L есть запись в дополнительной таблице S_I_xxxxxx. Задача: выбрать всех "ивановых", информацию брать только по источникам с кодом 2 и 3, выдать фамилию и адрес.

Пишем запрос

SELECT fl.FAMILY, ad.COUNTRY
FROM schema.FIZ_L fl, schema.ADDRESS ad, schema.S_I_FIZ_L sif, schema.S_I_ADDRESS sia
WHERE
-- объединение базовых таблиц через OUTER JOIN, так как адрес у физлица может быть, а может и не быть
ad.OBJ_ID_ID (+)= fl.OBJ_ID_ID
-- объединение FIZ_L со своей служебной таблицей
AND sif.fiz_l_id_id = fl.fiz_l_id
-- объединение таблицы адресов со своей служебной таблицей тоже по OUTER JOIN - законы ORACLE

AND sia.address_id_id (+)= ad.address_id
-- отсекаем теперь по источникам данных для таблицы FIZ_L
AND sif.source_t_id_id in (2, 3)
-- отсекаем теперь по источникам поступления адресов
AND sia.source_t_id_id in (2, 3)

Вроде бы все хорошо, но есть огромное НО. Согласно толмута ОРАКЛА, операция IN не разрешается для использования в условиях OUTER JOIN, и если у вас есть цепочка объединений table.id (+)= table2.id (+)= table3.id AND table3.ttt in (2,3), то вся геометрия летит коту под хвост и получается строгий INNER JOIN, что в данном случае нас не устраивает. Потому последняя строка условитя неверна. ....- потому что в даном примере есть запись по самому физлицу OBJ_ID_ID = 1 от источника 2, но адреса нету от источника 2, потому адрес показывать не надо, НО САМО ФИЗЛИЦО НАДО. В данном случае запись полностью будет удалена, что не есть верно.....

Я решил переделать....
..... AND (sia.source_t_id_id (+)= 2 OR sia.source_t_id_id (+)= 3)

Не тут то было .... ERROR ORA...... OUTER JOIN NOT ALLOWED WITH "OR" and "IN" OPERATION....

Ну и что тогда делать? Я прекрасно понимаю, что можно перейти на ORACLE 9, воспользоваться
table LEFT JOIN table2
ON table.ID = table2.ID AND table2.source_t_id_id in (2,3)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

собственно, но пока такая роскошь не светит.. Что делать и как вы решаете такие вопросы?
...
Рейтинг: 0 / 0
OUTER JOIN через (+)=
    #32026879
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я стараюсь избегать сложных джоинов
обычно удается обойтись вложенным запросом.

если уж совсем ничего не сделать
может сделать два запроса и сложить их Юнитом?
...
Рейтинг: 0 / 0
OUTER JOIN через (+)=
    #32026915
skif
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, только не два, а четыре. Комбинаторика (2,2) (2,3) (3,2) (3,3)
...
Рейтинг: 0 / 0
OUTER JOIN через (+)=
    #32026919
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, конечно, данном случае так.
я говорил о принципиальной возможности обойти проблему.
В зависимости от связей возможно еще понадобится отбрать уникальные

select distinct (select 1 unit select 2 unit select 3 unit delect 4)
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / OUTER JOIN через (+)=
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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