Cómo comprobar el valor de columna de todos los registros padre de un niño en SQL

Su Nguyen:

Digamos que tenemos una sola tabla con 3 columnas: ID , PARENT_ID y VALOR .

Tenemos, por ejemplo, 8 registros:

ID PARENT_ID VALUE
A  NULL      1
B  A         1
C  B         0
D  C         1
E  D         1
F  E         1
G  F         1
H  G         0   

¿Cómo podemos comprobar mediante una consulta SQL o un procedimiento almacenado (para MySQL preferentemente) si cualquiera de los registros padre para el registro con ID "G" tiene un valor de 0? Si uno de los padres de la cadena tiene 0 para VALOR, no hay necesidad de comprobar más atrás.

Esto tiene que obra mediante la adopción de cualquier identificación del niño y mirada a toda la cadena de sus padres antes de ese niño. Algunos niño podría no tienen padres o también podría tener una cadena de los padres y un registro padre puede tener 0 o muchos registros secundarios.

En este ejemplo, la búsqueda terminaría en registro con ID "C" (es decir: de retorno que ID está muy bien) ya que es el registro primario de la cadena de los padres (por G) que es 0 para VALUE.

Bill Karwin:

He aquí un ejemplo de una consulta de CTE recursiva MySQL 8.0 que hace lo que describes, atravesar los antepasados ​​de 'G' y restablecer las que tienen un valor = 0:

with recursive cte as (
  select * from mytable where id = 'G'
  union all
  select t.* from cte join mytable t on t.id = cte.parent_id
) select * from cte where value = 0;

+------+-----------+-------+
| id   | parent_id | value |
+------+-----------+-------+
| C    | B         |     0 |
+------+-----------+-------+

Leer https://dev.mysql.com/doc/refman/8.0/en/with.html para más información sobre las consultas CTE recursivas.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=372806&siteId=1
Recomendado
Clasificación