Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.30;
Скачать: CL | DM;

Вниз

Как обойти проблему связи таблиц!   Найти похожие ветки 

 
rayrom ©   (2005-09-20 09:44) [0]

Доброе время суток!

Есть проблема, нужно найти решение!
При выполнении запроса:
select a.pole1, b.pole2
from tabl1 a, tabl2 b
where a.nza = b.nza

Не выводятся значения из таблицы 1 если в таблице 2 нет записей для связи, как это обойти, чтоб в любом случае значения из таблицы 1 выводились пусть даже с пустым значением в поле2.
Оракл версии 8.


 
Sergey13 ©   (2005-09-20 09:46) [1]

where a.nza = b.nza(+)
Учите матчасть.


 
rayrom ©   (2005-09-20 09:56) [2]

2 Sergey13 - спасибо, проверим, учить некогда!


 
Fedia ©   (2005-09-20 09:56) [3]

>Учите матчасть.
ИМХО, тут надо хотя бы направление давать, в котором капать


select a.pole1, b.pole2
from tabl1 a
left join tabl2 b on
a.nza = b.nza


 
rayrom ©   (2005-09-20 10:01) [4]

2 Fedia - Оракл 8, join не поддерживатеся!!!


 
Sergey13 ©   (2005-09-20 10:06) [5]

2[2] rayrom ©   (20.09.05 09:56)
>учить некогда!
И чем ты так занят? 8-)


 
rayrom ©   (2005-09-20 10:10) [6]

2 Sergey13 - другой работы выше крыши, вот прогу пишу и то эпизодически! А работал с МуСКЛом, там джойны поддерживаются и проблем при связи с отсутствующей записью не было а тут вот в Ораклах вылезла! По этому и приходится консультироваться у Мастеров!


 
ANB ©   (2005-09-20 11:29) [7]


> rayrom ©   (20.09.05 10:10) [6]
(+) в оракле прекрасно заменяет лефт джойн.


 
rayrom ©   (2005-09-20 14:31) [8]

Мдя проблема усложнилась:
select a.pole1, b.pole2
from tabl1 a, tabl2 b
where a.nza = b.nza(+) and b.isn = (select max(b.isn) from tabl2 where a.nza=b.nza(+))

Этот запрос должен был вывести 9 записей а выводит 6, остальные 3 не имеют записей в таблице 2 для связи, а в таблице 1 они есть!!!
Что посоветуете?!!!


 
Anatoly Podgoretsky ©   (2005-09-20 14:40) [9]

Используй явное левое внешнее соединение.


 
rayrom ©   (2005-09-20 14:47) [10]

2 Anatoly Podgoretsky пример плиз!


 
Sergey13 ©   (2005-09-20 14:48) [11]

2 [8] rayrom ©   (20.09.05 14:31)
С алиасами разберись. Зачем они в подзапросе. И плюс там вроде ни к чему.


 
rayrom ©   (2005-09-20 14:53) [12]

2 Sergey13 проблема в том что вторая таблица накопительная т.е. в первой матер записи а во второй детайл записи и я для отображения последнего состояния использую подзапрос, чтоб вывело из первой мастера, а из второй последнюю запись детайла!


 
Sergey13 ©   (2005-09-20 14:56) [13]

2[12] rayrom ©   (20.09.05 14:53)
Ну так и что? Почему в подзапросе стоит a.nza=b.nza(+)?  a и b это алиасы из головного запроса. Должно быть (вроде ) tabl2.nza=a.nza


 
msguns ©   (2005-09-20 14:58) [14]

Уракл поддерживает вложенные (Select from select) запросы ?


 
Sergey13 ©   (2005-09-20 14:59) [15]

2[14] msguns ©   (20.09.05 14:58)
Угу


 
evvcom ©   (2005-09-20 15:04) [16]


>
> > rayrom ©   (20.09.05 10:10) [6]
> (+) в оракле прекрасно заменяет лефт джойн.


> Anatoly Podgoretsky ©   (20.09.05 14:40) [9]
> Используй явное левое внешнее соединение.

Нету в восьмерке LEFT JOIN, только (плюсик).


 
Anatoly Podgoretsky ©   (2005-09-20 15:05) [17]

rayrom ©   (20.09.05 14:47) [10]
Я не специалист по Ораклу, я тебе описывают как решать задачу, а конкретный синтаксис твое дело. Зачем давать пример по MS SQL если я не уверен, что он там пойдет.


 
rayrom ©   (2005-09-20 15:08) [18]

2 Sergey13 не прокатывает и такой вариант:
select a.pole1, b.pole2
from tabl1 a, tabl2 b
where a.nza = b.nza(+) and b.isn = (select max(isn) from tabl2 where table2.nza=a.nza)

Выодит теже 6 записей! Есть еще варианты?


 
msguns ©   (2005-09-20 15:11) [19]

Используй вложенную выборку через +


 
rayrom ©   (2005-09-20 15:14) [20]

2 msguns где именно ставить это +


 
Sergey13 ©   (2005-09-20 15:18) [21]

2 [18] rayrom ©   (20.09.05 15:08)
А-а-а-а. Ну дык правильно. 8-)
Ты же ограничиваешь b.isn а там только 6 значений.
Попробуй b.isn(+) =
только вряд ли пропустит такое.
Можно попробовать так

select a.pole1, b.pole2
from tabl1 a, (select nza,pole2,max(isn) from tabl2 Group by nza,pole2) b
where a.nza = b.nza(+)

Или нечто похожее изобразить.


 
msguns ©   (2005-09-20 15:26) [22]

>rayrom ©   (20.09.05 15:14) [20]
>где именно ставить это +

а подумать ?


 
rayrom ©   (2005-09-20 15:33) [23]

Ладно, чтоб избежать дальнейших непоняток привожу запрос в полном виде:
select a.nza, a.isn, a.act, a.prin_amt, (a.fam || "" "" || substr(a.ima,1,1) || "". "" || substr(a.otch,1,1) || ""."") nazv, a.marka, a.god, t.date_to, (t.ser_tal || t.n_textal) talon, a.gos_num, a.teh_op
from avt_new a, tex_osm t
where a.isn = t.isn(+) and t.key_nid = (SELECT MAX(key_nid) FROM TEX_OSM WHERE tex_osm.isn = a.isn) and a.prin_amt = 0

2 msguns было бы время не задавал бы таких вопросов!!!


 
Sergey13 ©   (2005-09-20 15:46) [24]

2[23] rayrom ©   (20.09.05 15:33)
Попробуй написать как в [21]. Кажется должно прокатить.
Писать за тебя нет времени у меня. 8-)


 
Val ©   (2005-09-20 15:47) [25]

коллеги, ну что же мы - надо по-быстренькому напрячься и помочь ясновельможному пану rayrom ©  - у него времени нет на плюсики всякие...


 
rayrom ©   (2005-09-20 15:58) [26]

2 Sergey13 как я понял в твоем предложении [21], ты предлагаеш отобрать сразу из таблицы 2 все данные а потом их присоединять к таблице 1. Так?


 
Sergey13 ©   (2005-09-20 16:19) [27]

2[26] rayrom ©   (20.09.05 15:58)
>Так?
Угу.



Страницы: 1 вся ветка

Текущий архив: 2005.10.30;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.038 c
2-1128037519
TechnoDreamer
2005-09-30 03:45
2005.10.30
Помогите составить запрос


1-1128437154
Aleksey
2005-10-04 18:45
2005.10.30
Error 217


14-1128597016
MBo
2005-10-06 15:10
2005.10.30
О книгах Седжвика


3-1127092937
DrAndrey
2005-09-19 05:22
2005.10.30
Перехват ошибки в хранимой процедуре при добавлении строки


1-1128376693
Германн
2005-10-04 01:58
2005.10.30
Не могу "запустить" программу под дебаггером из IDE.