Это может быть лучше в случае производительности:
SELECT
*,
(TOP 1 myLookupTable.columnB FROM mytable AS myLookupTable WHERE myLookupTable.keyColumn = mytable.keyColumn) as firstRecordOfColumnB
FROM
mytable
WHERE
columnA = 'apple'
Но для первой части я не знаю лучшего решения.
Edit:
Если keyColumn уникален, данные в firstRecordOfColumnB будут такими же, как в mytable.columnB.
Если он не уникален, по крайней мере, вам нужно отсортировать эти данные, чтобы получить соответствующий TOP 1, например:
SELECT
*,
(TOP 1 myLookupTable.columnB FROM mytable AS myLookupTable WHERE myLookupTable.keyColumn = mytable.keyColumn
ORDER BY myLookupTable.sortColumn) as firstRecordOfColumnB
FROM
mytable
WHERE
columnA = 'apple'