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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top