Во-первых, вы не можете оптимизировать запрос .Запросы всегда переписываются оптимизатором и могут давать очень разные результаты в зависимости от объема данных, индексов и т. Д. Поэтому, если у вас медленный запрос, вы должны посмотреть на план выполнения, чтобы увидеть, что происходит.И если у вас есть запрос, который не является медленным, вы не должны его оптимизировать.
Нет ничего плохого в подселектах как таковых.Как предполагает Wernfriend Domscheit, это даст вам минимальную дату column_date, которая, как я полагаю, находится в таблице 2.
SELECT MIN( b.column_date )
FROM table1 a
INNER JOIN table2 b on a.column1 = b.column1
WHERE a.id= '1234'
Это гарантированно даст вам одну строку.Если вам нужно больше, чем просто поле даты, будут выбраны строки с минимальной датой:
SELECT a.*, b.column_date
FROM table1 a
INNER JOIN table2 b on a.column1 = b.column1
WHERE a.id= '1234'
AND b.column_date = ( SELECT MIN( b2.column_date ) FROM table2 b2 )
Но если ваша column_date не уникальна, это может вернуть несколько строк.Если это возможно, вам нужно что-то в данных, чтобы дифференцировать строки для выбора.Это гарантированно даст вам одну строку:
SELECT * FROM (
SELECT a.*, b.column_date
FROM table1 a
INNER JOIN table2 b on a.column1 = b.column1
WHERE a.id= '1234'
AND b.column_date = ( SELECT MIN( b2.column_date ) FROM table2 b2 )
ORDER BY a.some_other_column
)
WHERE ROWNUM = 1
В достаточно недавней версии Oracle вы можете использовать FETCH FIRST 1 ROW ONLY
вместо ROWNUM
запроса.Я не думаю, что это имеет значение.