You can achieve the same thing with subqueries. If you're after better performance, I'm not sure that rewriting the query this way will improve things.
Also, consider that the semantics changed slightly, as now you're doing OUTER joins instead of INNER joins. Make sure this is ok in your case.
SELECT OS.NAME
,OS.ITEMID
,OS.PARENTID
,PARENTNAME = (
SELECT NAME
FROM OPERATIONALSTRUCTURE AS OS2
WHERE OS.PARENTID = OS2.ITEMID
)
,OS.HIERID
,HIERNAME = (
SELECT NAME
FROM OPERATIONALSTRUCTURE AS OS3
WHERE OS.HIERID = OS3.ITEMID
AND H.HIERID = OS3.HIERID
)
,OS.HIERLEVEL
,H.LEVELNAME
FROM OPERATIONALSTRUCTURE AS OS
INNER JOIN HIERLEVELS H
ON H.HIERLEVEL = OS.HIERLEVEL
ORDER BY OS.HIERID
,OS.PARENTID
,OS.NAME
Another possibility is CROSS APPLY:
SELECT OS.NAME
,OS.ITEMID
,OS.PARENTID
,PARENTNAME
,OS.HIERID
,HIERNAME
,OS.HIERLEVEL
,H.LEVELNAME
FROM OPERATIONALSTRUCTURE AS OS
INNER JOIN HIERLEVELS H
ON H.HIERLEVEL = OS.HIERLEVEL
CROSS APPLY (
SELECT NAME AS PARENTNAME
FROM OPERATIONALSTRUCTURE AS OS2
WHERE OS.PARENTID = OS2.ITEMID
) AS OS2
CROSS APPLY (
SELECT NAME AS HIERNAME
FROM OPERATIONALSTRUCTURE AS OS3
WHERE OS.HIERID = OS3.ITEMID
AND H.HIERID = OS3.HIERID
) AS OS3
ORDER BY OS.HIERID
,OS.PARENTID
,OS.NAME
Long story short, you always need to go back to the same table reading the information you need. I'm afraid there's no way around it.
Hope this helps
Gianluca
-- Gianluca Sartori