¿Cómo implementar una instrucción SELECT "hasChildren" en SQL?
Pregunta
Digamos que tengo la siguiente tabla:
ID | parentID | MoreStuff
1 | -1 | ...
2 | 1 | ...
3 | 1 | ...
4 | 2 | ...
5 | 1 | ...
¿Cómo puedo generar una instrucción SQL SELECT para averiguar si una fila específica tiene hijos? En otras palabras, quiero saber si ID 1 tiene hijos, que en este caso tiene 3.
No estoy seguro de cómo crear la declaración SQL:
SELECT ID, hasChildren FROM myTable;
¿Qué se reemplazaría por hasChildren en la declaración SQL SELECT anterior?
Solución
Sin versión de grupo:
SELECT MyTable.Id, CASE WHEN EXISTS
(SELECT TOP 1 1 --you can actually select anything you want here
FROM MyTable MyTableCheck
WHERE MyTableCheck.ParentId = MyTable.Id
) THEN 1 ELSE 0 END AS HasRows
FROM MyTable
Otros consejos
Únete a la tabla en sí misma para encontrar si tiene hijos:
SELECT
parent.id as ID
, case when count(child.id) > 0 then 1 else 0 end as hasChildren
FROM myTable parent
LEFT JOIN myTable child
ON child.parentID = parent.ID
GROUP BY parent.id
Si ya conoce el ID principal, entonces la consulta es simple: simplemente seleccione el número de filas con ese ID principal.
SELECT count(*) FROM myTable where parentID = 1;
Hay respuestas muy válidas a tu pregunta que funcionarán. Sin embargo, consideraría el rendimiento de dicha consulta si su conjunto de datos es muy grande.
Si va a utilizar una Consulta grupal por o secundaria para obtener los datos, asegúrese de que las columnas ID y Principal tengan índices separados.
Para obtener un rendimiento aún mejor, debe agregar una columna llamada "haschildren" que podría ser un " bit " tipo de datos. Esta columna debe actualizarse a partir de su código de aplicación cuando los elementos se insertan o eliminan. Esto le permitiría ejecutar la consulta mucho más rápida:
SELECT * FROM table WHERE haschildren IS NOT NULL
Las soluciones anteriores están bien, pero no debe agregar una columna como 'haschildren' a menos que realmente tenga un problema de rendimiento (vea la publicación de GateKiller). Dicha columna desnormaliza la base de datos, es decir, la misma información se almacenará en 2 lugares, lo que hace que sea más probable que sus datos se vuelvan inconsistentes. Deberá mantener esta columna cada vez que inserte un nuevo hijo, elimine uno existente o actualice al padre de un hijo.