Возможно, ваш пример слишком упрощен, но я бы использовал группу по:
SELECT
a.user_id
FROM
table1 a
LEFT OUTER JOIN table2 b ON (a.user_id = b.user_id)
GROUP BY
a.user_id
Боюсь, что единственный способ использовать вложенные запросы:
Разница между этим запросом и вашим примером заключается в том, что «вспомогательная таблица» генерируется только один раз, однако в вашем примере вы генерируете «вспомогательную таблицу» для каждой строки в table1 (но может зависеть от компилятора, поэтому вы использовать анализатор запросов для проверки производительности).
SELECT
a.user_id,
b.sub_id
FROM
table1 a
LEFT OUTER JOIN (
SELECT
user_id,
min(sub_id) as sub_id,
FROM
table2
GROUP BY
user_id
) b ON (a.user_id = b.user_id)
Кроме того, если ваш запрос становится достаточно сложным, я бы использовал временные таблицы для упрощения кода, это может стоить немного больше времени на обработку, но значительно упростит обслуживание ваших запросов.
Пример временной таблицы:
SELECT
user_id
INTO
#table1
FROM
table1
WHERE
.....
SELECT
a.user_id,
min(b.sub_id) as sub_id,
INTO
#table2
FROM
#table1 a
INNER JOIN table2 b ON (a.user_id = b.user_id)
GROUP BY
a.user_id
SELECT
a.*,
b.sub_id
from
#table1 a
LEFT OUTER JOIN #table2 b ON (a.user_id = b.user_id)