| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Составление SQL-запросов > Сложный запрос по двум таблицам с MAX значением |
| Автор: KateL 16.9.2020, 14:06 | ||||
| MS Access, C++ Builder Есть две таблицы, каждой строке из Table_A может соответствовать несколько строк из Table_B по Table_A.ID = Table_B.A_ID Table_A с полями: ID, Year, ... Table_B с полями: ID, A_ID, N, Name, X, Y, ... Надо составить запрос, в котором из всех строк Table_B (для одного A_ID) выбирается одна строка с максимальным значением N (даже, если таких максимальных значений несколько) + условие по полям N, Yr, X и Y В результате должна получиться таблица: Yr, N_max, Name с сортировкой по N_max У меня получился такой запрос. Возможно, я там наворотила лишнего, т.к. плохо разбираюсь в сложных запросах.
Но! В случае, если максимальных значений N для одного A_ID несколько, все строки с ними выводятся в результате. А надо, чтобы для каждой строки Table_A в результате была только одна строка с максимальным значением N. Пример:
Помогите, пожалуйста |
| Автор: Агрох 16.9.2020, 15:20 | ||
TOP 1
Но в таком виде возьмёт условно случайную строку. В разное время или на разных серверах один и тот же запрос над одними и теми же данными вернёт разные значения, что не есть хорошо. Лучше добавить ещё какую то сортировку, чтобы добиться однозначности. |
| Автор: KateL 16.9.2020, 16:20 |
Увы, так я пробовала, но получается ВСЕГО одна строка |
| Автор: KateL 16.9.2020, 21:45 | ||||
это не важно, главное значение N 1) JOIN заменила на INNER JOIN (а то ругался) 2) дальше тоже не проходит. Выдает ошибку: Ошибка синтаксиса (пропущен оператор) в выражении запроса 't1.ID = t2.A_ID INNER JOIN (SELECT t3.A_ID, MAX(t3.N) AS N FROM table_b t3 GROUP BY t3.A_ID) AS t4 ON t2.A_ID = t4.A_ID' 3) Вот так работает, но снова с дублями
|
| Автор: ksnk 16.9.2020, 22:29 | ||
У меня нет возможности проверить на msaccess :( так что я на MySql
http://sqlfiddle.com/#!9/131805/13 вот тут можно посмотреть. Вроде, то что надо. Но это только для случая, когда комбинация N+Name однозначно определяет строку таблицы Table_В. Если данные такие и есть, то вполне работоспособно, с точностью до версии sql для Access |
| Автор: Akina 17.9.2020, 07:14 | ||
| KateL, смотрим http://forum.vingrad.ru/index.php?showtopic=260944&view=findpost&p=1879602 и делаем... а то пальцами в воздухе можно вертеть до бесконечности. Сделал мин. модель. Вот как выглядит запрос по мнению MS Access 2010:
|
| Автор: Агрох 17.9.2020, 10:33 | ||||
Писал на FB. В Access аналогом FIRST_VALUE, по моему, является просто FIRST.
Вариант без оконных функций:
|
| Автор: KateL 17.9.2020, 11:32 |
Спасибо за уделенное моему вопросу время. Но это совсем не то. В примере я написала Name как aaa1 aaa2 просто, чтобы как-то обозначить. Они вообще могут быть разные. Это как дополнительный комментарий к полю N Мне же надо в таблице Table_B для каждой группы по A_ID найти одно максимальное значение N и добавить к нему соответствующий Name (любой, если максимальных значений несколько) и Yr из Table_A |
| Автор: KateL 17.9.2020, 12:51 |
УРРРААА!!! ЗЗАРРРАБОТАЛО! Только LEFT JOIN заменила на INNER JOIN, т.к. не для всех строк Table_A есть соответствия в Table_B Ну и нужные мне сравнения вставила в select с MAX() Агрох, БОЛЬШОЕ вам спасибо |