Вот рабочий пример в MS SQL Server:
Select 'A' as Id, 10 as ValueA1 into #A
Insert into #A (Id,ValueA1 ) VALUES ('B', 20), ('C', 30)
Select 'A' as Id, 20 as ValueB1 into #B
Insert into #B (Id,ValueB1 ) VALUES ('A', 30), ('A', 40)
Insert into #B (Id,ValueB1 ) VALUES ('B', 15), ('B', 25), ('B', 35)
Insert into #B (Id,ValueB1 ) VALUES ('C', 18), ('C', 28), ('C', 38)
SELECT #A.Id, #A.ValueA1, coalesce(Max(Minors.ValueB1), Min(Majors.ValueB1))
FROM #A
LEFT JOIN (
SELECT #A.Id, #A.ValueA1, Max(#B.ValueB1) ValueB1
FROM #A LEFT JOIN #B ON #A.Id = #B.Id
WHERE #B.ValueB1 < #A.ValueA1 GROUP BY #A.Id, #A.ValueA1
) Minors ON Minors.Id = #A.Id
LEFT JOIN (
SELECT #A.Id, #A.ValueA1, Min(#B.ValueB1) ValueB1
FROM #A LEFT JOIN #B ON #A.Id = #B.Id
WHERE #B.ValueB1 >= #A.ValueA1 GROUP BY #A.Id, #A.ValueA1
) Majors ON Majors.Id = #A.Id
GROUP BY #A.Id, #A.ValueA1
DROP TABLE #A
DROP TABLE #B
Я думаю, что с небольшими изменениями вы можете адаптировать это к MS Access, например, функция объединения, которая сохраняет первый ненулевой элемент, может быть заменена на NZ (field1, field2)
Вот версия, совместимая с Access:
SELECT TableA.Id, TableA.ValueA1, Nz(Max(Minors.ValueB1),Min(Majors.ValueB1))
AS ValueB1
FROM
(SELECT TableA.Id, TableA.ValueA1, Max(TableB.ValueB1) AS ValueB1
FROM TableA LEFT JOIN TableB ON TableA.Id = TableB.Id
WHERE TableB.ValueB1 < TableA.ValueA1
GROUP BY TableA.Id, TableA.ValueA1
) AS Minors
RIGHT JOIN
(
(SELECT TableA.Id, TableA.ValueA1, Min(TableB.ValueB1) AS ValueB1
FROM TableA LEFT JOIN TableB ON TableA.Id = TableB.Id
WHERE TableB.ValueB1 >= TableA.ValueA1
GROUP BY TableA.Id, TableA.ValueA1
) AS Majors
RIGHT JOIN TableA ON Majors.ValueA1 = TableA.ValueA1
)
ON Minors.ValueA1 = TableA.ValueA1
GROUP BY TableA.Id, TableA.ValueA1;