Форум: "Базы";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];
ВнизПоследняя запись в связке один ко многим, нужна помощь!!! Найти похожие ветки
← →
RayRom © (2005-07-07 17:53) [0]Имеется две таблицы, главная и подчиненная связь по уникальному полю в отношении один ко многим.
Внимание вопрос: нужно построить запрос так чтоб при получении результата была только последняя запись подчиненной таблицы, т.е. получить результат из главной и подчиненной таблицы, но из подчиненной таблицы получить только последнюю запись а не все?
Ораклы версии 8.1.5.17
← →
Johnmen © (2005-07-07 17:56) [1]Критерий "последности" в студию :)
← →
rayrom © (2005-07-07 18:01) [2]Подробно:
Главная таблица - транспорт имеет два уникальных поля
1 - НЗА - жосткая привязка к транспорту
2 - ИСН - движения транспорта т.е. измемение владельца, агрегатов и т.д.
Связь идет с подчиненной таблицей по полю НЗА, но она имеет свое уникальное поле ИСН которое автоинкрементное, т.е. накопительная информация.
Так вот нуно выбрать весь транспорт но получить из подченной таблицы только последнюю запись для данного транспорта!
← →
rayrom © (2005-07-07 19:06) [3]И тишина :)
← →
Val © (2005-07-07 19:13) [4]вы не ответили на вопрос.
← →
DiamondShark © (2005-07-07 19:38) [5]Вместо подчинённой таблицы использовать запрос
select top1 *
from таблица
where условие связи
order by критерий порядка записей desc
← →
ЮЮ © (2005-07-08 03:01) [6]>т.е. получить результат из главной и подчиненной таблицы, но из подчиненной таблицы получить только последнюю запись а не все?
Синтаксиса Ораклы не знаю. На MS SQL я бы это сделал так:
SELECT Master.*, Detail.* FROM
Master
LEFT JOIN (Select MasterID, Max(Detail.Id) LastId FROM Detail GROUP BY MasterID) LastDetail ON Master.Id = LastDetail.MasterID
JOIN Detail ON LastDetail.LastId = Detail.Id,
Где Master и Detail связаны как 1..N: Master.ID = Detail.MasterID
← →
kaif © (2005-07-08 04:25) [7]Если нужно из двух таблиц сразу выбрать все главные записи и последнюю из каждой подчиненной (используем телепатию), то видимо потребуется LEFT OUTER JOIN с коррелированным подчиненным запросом значения
MAX(автоинкрементного поля) к подчиненнолй таблице.
Я не знаю, как на ORACLE, но в IB это выглядело бы примерно так:SELECT NZA
FROM <Главная_таблица> M
LEFT OUTER JOIN <Подчиненная_таблица> D
ON M.NZA = D.NZA AND
D.ISN = (SELECT MAX(ISN)
FROM <Подчиненная_таблица>
WHERE NZA = M.NZA)
Думаю, что на ORACLE точно так же.
← →
Кщд © (2005-07-08 05:17) [8]kaif © (08.07.05 04:25) [7]
Можно и так.
А можно с использованием аналитических ф-ций, что позволит избежать подзапроса.
← →
rayrom © (2005-07-08 11:10) [9]Спасибо за ответы но в этой версии Ораклов нету JOIN и всего с ним связанного, они появились только в 9 версии!!!
← →
Val © (2005-07-08 11:20) [10]плюсы же есть? перевести-то запрос из диалекта в диалект не особо много ума надо.
← →
kaif © (2005-07-08 13:48) [11]Что за версия ORACLE без JOIN-ов?
Это разве не SQL-сервер?
← →
evvcom © (2005-07-08 13:57) [12]
> Что за версия ORACLE без JOIN-ов?
> Это разве не SQL-сервер?
Сервер. Я с MSSQL на Oracle 9.2 сел, поэтому не испытал такого кайфа. А кто давно на Oracle сидит, те пишут типа такого:
... FROM a, b WHERE a.id (+) = b.id
по-моему это аналог RIGHT OUTER JOIN, но могу напутать, так как пишу именно через JOIN
← →
evvcom © (2005-07-08 14:01) [13]
> А можно с использованием аналитических ф-ций, что позволит
> избежать подзапроса.
Вот этого в восьмерке точно нет.
Через rownum с order by ... desc можно, но придется использовать опять же вложенный подзапрос, т.к. сначала вычисляются все rownum, а уж потом делается order by.
← →
Val © (2005-07-08 15:27) [14]> [13] evvcom © (08.07.05 14:01)
> Вот этого в восьмерке точно нет.
Неверно. Зависит от edition. В Enterprise аналит.функции есть.
По поводу плюса - дело привычки.
← →
isasa © (2005-07-08 15:46) [15]Select MasterID, Max(Detail.Id) LastId FROM Detail GROUP BY MasterID)
А если ID - код репликации (GUID)
Надо доп критерий - период, дата изменения, дата регистрации ...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c