50% возможно.Вы можете использовать CTE, чтобы избежать записи его дважды, но он все равно будет выполняться дважды.
;WITH p
AS (SELECT child,
parent
FROM something-complex)
SELECT p.child,
p.parent,
q.parent AS grandparent
FROM p
LEFT JOIN p AS q
ON q.child = p.parent
Если запрос дорогой, вам потребуется материализовать его в переменную таблицы или таблицу #temp
, чтобы избежатьобъединение, вызывающее два вызова базового запроса.