C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
OUTER JOIN, проблемы с SUBJ
olegenty
Отправлено: 09.06.2004, 09:57


Ветеран

Группа: Модератор
Сообщений: 2412



что-то я не пойму, OUTER JOIN в Interbase/Firebird/Yaffil вообще не пашет?

пишу отдельно запрос левой части. результат есть.
соединяю внешним левым объединением — И ЗАПИСЕЙ ОСТАЁТСЯ МЕНЬШЕ. вместо NULL в полях правой части, для которых нет связанных записей, поля ПРОСТО НЕ ВОЗВРАЩАЮТСЯ. кто нибудь сталкивался с этой пробемой?

вопрос-то решается легко: пишется ХП по левой части, которая внутри себя доцепляет либо заполняет NULL поля правой части. но это в разы медленнее, чем OUTER JOIN, а он не работает...
Nick
Отправлено: 10.06.2004, 10:31


Машинист паровоза

Группа: Участник
Сообщений: 247



Пробовал поработать
FULL OUTER JOIN
С большими наборами данных наоборот работает в разы медленней
чем ХП которая выбирает сначала по левой части все,
потом то что есть в правой и нет в левой.


olegenty
Отправлено: 10.06.2004, 11:59


Ветеран

Группа: Модератор
Сообщений: 2412



мне фулл не нужен, нужен RIGHT/LEFT, не работающий, падла, как в SQL-92 прописано и должно работать...
Deem
Отправлено: 11.06.2004, 10:46


Мастер участка

Группа: Участник
Сообщений: 327



У меня работает.

Пример:
табл SERVICE
SERVICE SPECID
Обновление1 2
Обновление2 1
Обновление3 3
Обновление4 4
Обновление5 null
Обновление6 null
табл SPEC
ID NAME
1 Дима
2 Саша
3 Петя
4 Коля

select name, service
From SPEC right join SERVICE on (SPECID = ID)

Результат:

NAME SERVICE
Саша Обновление1
Дима Обновление2
Петя Обновление3
Коля Обновление4
null Обновление5
null Обновление6

Если к указанному запросу дописать where что-то там, то можно результат укоротить. Мож там у тебя ошибка?
Deem
Отправлено: 11.06.2004, 12:48


Мастер участка

Группа: Участник
Сообщений: 327



Добавляю таблы
SERVICEID DDATE
1 01.06.2004
2 02.06.2004
6 06.06.2004
5 05.06.2004


NAME ID
январь 1
февраль 2
март 3
апрель 4
май 5
июнь 6
июль 7
август 8
сентябрь 9
октябрь 10
ноябрь 11
декабрь 12
, а в service добавляю ID
и пишу
CODE

select SP.name, service, ddate,m.name
From SPEC SP right outer join SERVICE SE on (SE.SPECID = SP.ID)
left outer join DATA DA on (Se.ID = DA.SERVICEID)
left outer join MONTHES M on (case when da.ddate is null
then 0
else
extract (MONTH FROM DA.DDATE)
end = M.ID)


Результат:

NAME SERVICE DDATE NAME1
Саша Обновление1 01.06.2004 июнь
Дима Обновление2 02.06.2004 июнь
Петя Обновление3 null null
Коля Обновление4 null null
nul Обновление5 05.06.2004 июнь
nul Обновление6 06.06.2004 июнь


(Cколько ни долбался, нормальных колонок не получилось. Даже ТАВ сжирает. smile.gif )

Отредактировано Deem — 11/06/2004, 13:54
AVC
Отправлено: 11.06.2004, 12:57


Ветеран

Группа: Модератор
Сообщений: 1583



А в чем вопрос. Результат не противоречит вашим данным или я чего то не вижу.

Вернуться в Работа с базами данных в C++Builder