2010-11-07 31 views
6

que tiene SQL estructura de la tabla del servidor, como a continuación:padre-hijo en la misma mesa

ID Name  ParentID 
----------------------- 
1  Root  NULL 
2  Business 1 
3  Finance 1 
4  Stock  3 

Quiero mostrar los detalles en mi página web como

ID Name  ParentName 
------------------------- 
1  Root  - 
2  Business Root 
3  Finance Root 
4  Stock  Finance  

¿Cómo puedo construir mi consulta SQL ? Por favor, ayúdame.

+0

¿Está el parentID referencia a la columna ID en la misma mesa? – Eric

+0

@kirkamal, ¿puedes marcar 1 de las respuestas como aceptadas? – Eric

Respuesta

4

Suponiendo SQL Server 2005 +, utilice un CTE recursiva como esto:

WITH hierarchy AS (
    SELECT t.id, 
     t.name, 
     t.parentid, 
     CAST(NULL AS VARCHAR(50)) AS parentname 
    FROM YOUR_TABLE t 
    WHERE t.parentid IS NULL 
    UNION ALL 
    SELECT x.id, 
     x.name, 
     x.parentid, 
     y.name 
    FROM YOUR_TABLE x 
    JOIN hierarchy y ON y.id = x.parentid) 
SELECT s.id, 
     s.name, 
     s.parentname 
    FROM hierarchy s 

el casting de la NULL puede parecer extraño, pero por defecto de SQL Server el tipo de datos INT menos que se especifique de manera como se ve en mi consulta.

8

probar este ...

SELECT a.ID, a.Name, b.Name AS 'ParentName' 
FROM TABLE AS a LEFT JOIN TABLE AS b on a.ParentID = b.ID 

Con la combinación izquierda, la consulta no encontrará nada a unirse para el NULL y volver en blanco para la columna de la ParentName.

EDIT:

Si no desea que la columna 'Padre' a estar en blanco, pero quiere mostrar una '-' rociada a continuación, utilice esta consulta.

SELECT a.ID, a.Name, COALESCE(b.Name,'-') AS 'ParentName' 
FROM TABLE AS a LEFT JOIN TABLE AS b on a.ParentID = b.ID 
+0

¿Qué sucede si necesita bajar los niveles de dos/tres/cuatro/etc.? –

+0

¿Qué pasa si el OP pidió eso? ;-) –

+0

Jus sigue uniéndose a la misma tabla una y otra vez – Eric

1

Creo que la siguiente consulta funcionaría. No lo he probado.

SELECT 
ID 
, name 
, (CASE WHEN parent_name IS NULL THEN '-' ELSE parent_name END) 
FROM 
RELATIONS 
, (SELECT 
parentID 
, name AS parent_name 
FROM 
RELATION) PARENT 
WHERE 
RELATIONS.parentId = PARENT.parentId 

Básicamente, lo que estoy haciendo está haciendo es la elección de los datos de ellos, y relacionándolo con cada tupla.

3
SELECT CH.ID, CH.NAME, ISNULL(PA.NAME, '-') AS "PARENTNAME" 
FROM TBL CH 
LEFT OUTER JOIN TBL PA 
ON CH.PARENTID = PA.ID 
0

Esta es una forma sencilla:

SELECT ID,Name,(SELECT TOP 1 Name FROM Table t WHERE t.ParentID=ParentID) AS ParentName FROM Table 
Cuestiones relacionadas