Форум: "Базы";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];
ВнизКак обойти проблему связи таблиц! Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.041 c