2011-02-14 3 views
1

Est-il possible de se joindre à une instruction select imbriquée avec lui-même (sans l'écrire deux fois et exécuter deux fois)autojointure avec requête select imbriquée dans T-SQL

Quelque chose comme ça serait idéal

SELECT P.Child, P.Parent, Q.Parent AS GrandParent 
FROM (SELECT Child, Parent FROM something-complex) AS P 
LEFT JOIN P AS Q ON Q.Child = P.Parent 

Répondre

4

50% possible. Vous pouvez utiliser un CTE pour éviter de l'écrire deux fois, mais il sera toujours exécuté deux fois.

;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 

Si la requête est cher, vous auriez besoin de se matérialiser dans une variable de table ou #temp table pour éviter l'auto se joindre à provoquer deux invocations de la requête sous-jacente.

+0

Bon point sur l'exécution deux fois. – mellamokb

2

Vous pouvez utiliser une expression de table commune:

WITH P AS (SELECT Child, Parent FROM something-complex) 
SELECT P.Child, P.Parent, Q.Parent as GrandParent 
LEFT JOIN P AS Q ON Q.Child = P.Parent