Форум программистов, компьютерный форум, киберфорум
Наши страницы
MS Access
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
Envoy
0 / 0 / 0
Регистрация: 06.09.2013
Сообщений: 8
1

Выборка строк по максимальной дате из нескольких таблиц

20.10.2013, 19:12. Просмотров 1626. Ответов 4
Метки нет (Все метки)

Здравствуйте! Помогите пожалуйста!
Есть три таблицы Имущ (список имущества), СоотвРаспол (Расположение этого же имущества, у одного и того же имущества может быть несколько записей или ни одной) и СоотвМатОтв (материально ответственный по имуществу, у одного и того же имущества может быть несколько записей или ни одного).
Нужно в одном запросе получить по каждой записи имущества (Имущ) значение из СоотвРаспол (а именно КемЭкспл и ФизРаспСоотв, где Max(ЭксплС)) и из СоотвМатОтв (а именно СМОМатОтв, где Max(СМОМатОтвС)).
Нашел несколько вариантов на форуме, но ни один не подходит. Один через Select Top 1, он собирает все по одному значению (указанному) из Имущ, как получить сразу по всем значениям я не знаю... как ни пробовал не получается... не хватает квалификации =) Другой вариант через ROW_NUMBER(), но он я так понял в Access не работает (или я криво лепил).

Вариант, который у меня получился, но не так как нужно:
SQL
1
2
3
4
SELECT Имущ.КодИм, MAX([ЭксплС] & "-" & [КемЭкспл] & "-" & [ФизРаспСоотв]) AS Распол, MAX([СМОМатОтвС] & "-" & [СМОМатОтв]) AS МатОтв
FROM (Имущ LEFT JOIN СоотвРаспол ON Имущ.КодИм = СоотвРаспол.ИмущРаспол) LEFT JOIN СоотвМатОтв ON Имущ.КодИм = СоотвМатОтв.СМОИмущ
GROUP BY Имущ.КодИм
ORDER BY Имущ.КодИм;
Так я получаю по одной записи из Имущ с максимальными значениями (по дате) из таблиц СоотвМатОтв и СоотвРаспол. Но данные собраны в один столбец, что не дает корректно работать с ними дальше =(
Извините, если слишком много лишнего написал...

Добавлено через 2 часа 20 минут
Ошибся запрос написанный выше выдает не совсем последние данные, вот исправленный, который выдает правильные данные данные.
SQL
1
2
3
4
SELECT Имущ.КодИм, MAX(YEAR([ЭксплС]) & "." & MONTH([ЭксплС]) & "." & DAY([ЭксплС]) & "-" & [КемЭкспл] & "-" & [ФизРаспСоотв]) AS Распол, MAX(YEAR([СМОМатОтвС]) & "." & MONTH([СМОМатОтвС]) & "." & DAY([СМОМатОтвС]) & "-" & [СМОМатОтв]) AS МатОтв
FROM (Имущ LEFT JOIN СоотвРаспол ON Имущ.КодИм = СоотвРаспол.ИмущРаспол) LEFT JOIN СоотвМатОтв ON Имущ.КодИм = СоотвМатОтв.СМОИмущ
GROUP BY Имущ.КодИм
ORDER BY Имущ.КодИм;
Можно конечно же вместо "-" как разделителя добавить другой символ и при помощи него попробовать разделять полученный столбец на несколько, но это не совсем удобно и хотелось бы проще.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.10.2013, 19:12
Ответы с готовыми решениями:

Выборка по максимальной дате для данных - SQL
Есть необходимость сделать запрос, для вывода автомобилей, который нужно пройти техосмотр в...

Выборка из нескольких таблиц
Всем привет! У меня возникла такая проблема: есть таблицы 14, 15, 16. Надо сделать форму чтобы при...

Выборка из нескольких таблиц
Доброго времени суток. Будьте добры, подскажите. На примере базы данных о фильмах (видеотеки),...

Выборка данных из нескольких таблиц
Есть две таблицы. Одна хранит в себе список объектов(поля: object_id,object_name). Вторая -...

Выборка из нескольких таблиц одновременно
Можно ли выбрать данные из нескольких таблиц одновременно? Что-то типа 'Select * from Tab1, Tab2,...

4
iifat
2390 / 1541 / 136
Регистрация: 05.06.2011
Сообщений: 4,310
21.10.2013, 09:42 2
Боюсь, проще не получится. Для разделения можно, наверное, написать substr (твой max) as ... — и так несколько раз, столько, сколько надо полей в результате запроса. Больше ничего в голову не лезет.
В нормальных SQL-серверах советуют вложенные запросы с выбором первой записи, но в Access, как мне объяснили, top 1 вполне может выдавать и две записи. Опять же, что делать, если записей нет вообще — непонятно.
Если речь идёт о форме, можно сделать две подчинённых.
1
Envoy
0 / 0 / 0
Регистрация: 06.09.2013
Сообщений: 8
21.10.2013, 11:24  [ТС] 3
я тут же на форуме видел вариант от cygapb-007
Выбор строк по максимальной дате

попытался переделать по себя, но не получается, выдает ошибку синтаксиса в FROM
Вот мой нерабочий вариант:
SQL
1
2
3
4
5
6
7
8
SELECT КодИм
FROM headers h
JOIN (
   SELECT 
      ROW_NUMBER() OVER(partition BY КодИм ORDER BY ЭксплС DESC) RowNum,
      , *
   FROM Имущ
   ) d ON d.КодИм=h.КодИм AND d.RowNum = 1
Добавлено через 8 минут
Спасибо! Буду сегодня вечером дома пробовать этот вариант
Цитата Сообщение от iifat Посмотреть сообщение
Для разделения можно, наверное, написать substr (твой max) as ...
0
iifat
2390 / 1541 / 136
Регистрация: 05.06.2011
Сообщений: 4,310
21.10.2013, 13:41 4
Цитата Сообщение от Envoy Посмотреть сообщение
видел вариант
Дык MS SQL-сервер — это отнюдь не Access. Что-то я в сём последнем вот такого
Цитата Сообщение от Envoy Посмотреть сообщение
SELECT ROW_NUMBER() OVER(partition BY КодИм ORDER BY ЭксплС DESC) RowNum, , * FROM Имущ
не помню. Это, конечно, не значит, что его там нет
0
Envoy
0 / 0 / 0
Регистрация: 06.09.2013
Сообщений: 8
21.10.2013, 13:58  [ТС] 5
Все понятно
0
21.10.2013, 13:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.10.2013, 13:58

Выборка из нескольких таблиц. Дублирование записей
Всем привет! Возникла проблема с выводом (совмещением) записей из нескольких таблиц. В каждой из...

Выборка данных из нескольких таблиц в зависомости от условия
http://www.cyberforum.ru/attachment.php?attachmentid=650595&stc=1&d=1455792309 Проблема такая....

Выборка из нескольких таблиц и создание новой записи через Delphi
Здравствуйте! Имеется БД в MS Access, делаю для нее программу в Deplhi. Через DBGrid и ADOQuery...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru