Hace mucho tiempo, cuando trabajaba en una tienda Oracle, daba por sentado el CONNECT_BY. Ahora estoy trabado trabajando con SQL Server 2005 y tengo algunas jerarquías de objetos desagradables. Específicamente, tenemos una tabla de autorreferencia en la que todos los registros secundarios tienen una columna con la identificación de sus padres. Actualmente tenemos una vista que asigna a los niños a niveles en la jerarquía y una desagradable consulta que hace el trabajo pesado para conectar a los padres con sus hijos. Si bien este método funciona, está lejos de ser elegante y huele a mancha. Solo tengo curiosidad de cómo otras personas recuperan datos jerárquicos de SQL Server 2005.Consultas jerárquicas en SQL Server 2005
Respuesta
en SQL Server 2005 puede usar Common Table Expressions (CTE) para esto.
Esto crea su tabla jerárquica típica y utiliza un CTE para seleccionar la estructura jerárquica y crear una ruta para cada elemento.
CREATE TABLE tblHierarchy (ID int, ParentID int NULL, Name varchar(128));
INSERT INTO tblHierarchy VALUES (1, NULL, '1');
INSERT INTO tblHierarchy VALUES (2, NULL, '2');
INSERT INTO tblHierarchy VALUES (3, NULL, '3');
INSERT INTO tblHierarchy VALUES (4, 1, '1.1');
INSERT INTO tblHierarchy VALUES (5, 1, '1.2');
INSERT INTO tblHierarchy VALUES (6, 4, '1.1.1');
WITH Parent AS
(
SELECT
ID,
ParentID,
Name AS Path
FROM
tblHierarchy
WHERE
ParentID IS NULL
UNION ALL
SELECT
TH.ID,
TH.ParentID,
CONVERT(varchar(128), Parent.Path + '/' + TH.Name) AS Path
FROM
tblHierarchy TH
INNER JOIN
Parent
ON
Parent.ID = TH.ParentID
)
SELECT * FROM Parent
SALIDA:
ID ParentID Path
1 NULL 1
2 NULL 2
3 NULL 3
4 1 1/1.1
5 1 1/1.2
6 4 1/1.1/1.1.1
Para su información. SQL Server 2008 admite un nuevo tipo de datos Hierarchy ID.
Lea esto:
http://www.sitepoint.com/article/hierarchical-data-database/2/
Debe darle algunas ideas ...
Sí, los conjuntos anidados son definitivamente el camino a seguir para obtener jerarquías ilimitadas en un RDBMS. La descripción de Sitepoint hace que suene un poco más complicado de lo que realmente es, y las implementaciones se pueden simplificar, por ejemplo. teniendo una 'orden de rango' y 'rango de próximo hermano' en lugar de 'izquierda' y 'derecha'. – bobince
haber usado tanto, encontré CONNECT BY es algo más flexible y más fácil de usar que CTE. La pregunta no es diferente a una que respondí hace unas semanas. Consulte Here para obtener una breve comparación de CONNECT BY y CTE y Here para ver un ejemplo de una consulta que utiliza CTE.
Difícil suerte de que CONNECT BY no exista en MSSQL. –
para atravesar la profundidad de la jerarquía primero y luego al siguiente nivel hermanos, CTE se puede utilizar:
declare @tempTable TABLE
(
ORGUID int,
ORGNAME nvarchar(100),
PARENTORGUID int,
ORGPATH nvarchar(max)
)
;WITH RECORG(ORGuid, ORGNAME, PARENTORGUID, ORGPATH)
as
(
select
org.UID,
org.Name,
org.ParentOrganizationUID,
dbo.fGetOrganizationBreadcrumbs(org.UID)
from Organization org
where org.UID =1
union all
select
orgRec.UID,
orgRec.Name,
orgRec.ParentOrganizationUID,
dbo.fGetOrganizationBreadcrumbs(orgRec.UID)
from Organization orgRec
inner join RECORG recOrg on orgRec.ParentOrganizationUID = recOrg.ORGuid
)
insert into @tempTable(ORGUID, ORGNAME, PARENTORGUID,ORGPATH)
select ORGUID, ORGNAME, PARENTORGUID,ORGPATH
from RECORG rec
select *
from @tempTable where ORGUID in(select MIN(tt.ORGUID)
from @tempTable tt
group by tt.PARENTORGUID)
- 1. Consultas jerárquicas en MySQL
- 2. SQL Server 2008 a SQL Server 2005
- 3. SQL Server 2005 replicación
- 4. Isoweek en SQL Server 2005
- 5. SQL Server 2005 Error 701 - sin memoria
- 6. Restaurar SQL Server 2008 DB * a * SQL Server 2005
- 7. Editar sinónimos en MS SQL Server 2005
- 8. Indexar varchar en MS SQL Server 2005
- 9. subconsultas en UPDATE SET (sql server 2005)
- 10. TransactionInDoubtException usando System.Transactions en SQL Server 2005
- 11. ¿Dinámicamente nombrar índices en SQL Server 2005?
- 12. unen tres tablas en SQL Server 2005
- 13. UPSERT atómico en SQL Server 2005
- 14. Números persas en SQL Server 2005
- 15. instrucción IIF en SQL Server 2005
- 16. Concatene ntext en SQL Server 2005
- 17. degradación de SQL Server 2008 a SQL Server 2005
- 18. SQL Server 2008 compatibilidad con SQL Server 2005
- 19. Consultas actualmente en ejecución en SQL Server
- 20. Cómo administrar varios índices superpuestos en SQL Server 2005
- 21. SQL Server 2005: interbloqueo de transacción
- 22. Acceda a TimeZoneInfo desde SQL 2005 Server
- 23. sql server 2005 - exportar datos nvarchar (max)
- 24. SQL Server 2005 - Orden de combinaciones internas
- 25. SQL Server 2005 pérdida de precisión numérica
- 26. SQL Server 2005 ROW_NUMBER() sin ORDER BY
- 27. SQL Server 2005: ¿Por qué nombrar transacciones?
- 28. Intercalación de clientes y SQL Server 2005
- 29. MySQL vs SQL Server 2005/2008 rendimiento
- 30. Extraer horas de DateTime (SQL Server 2005)
la fuerza recursiva es CON() usted. har har har. –
¿Podría mostrar un ejemplo? –