¿Eliminar las mismas filas de varias columnas de referencia de forma s

¿Eliminar las mismas filas de varias columnas de referencia de forma segura?

Necesito encontrar todas las relaciones entre padres e hijos, que están todas vinculadas a mi columna principal ID

¿Cómo puedo eliminar las mismas columnas de referencia en la tabla? Digamos, por ejemplo, si quiero eliminar "Google", primero tengo que eliminar "HP" e Intel, también el hijo de HP.

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

He intentado lo siguiente hasta ahora, pero eso funciona con una sola columna.

    WITH tb  (id,Name, Level, Path, Parent)
AS
(
 SELECT 
    id,Name, 1 AS Level, 
    CAST('/'+Name as nvarchar(max)) as Path,
    CAST(NULL as nvarchar(max)) as Parent
 FROM krishtest
 WHERE parent1 IS NULL

 UNION All

 SELECT 
    e.id,e.Name, x.Level + 1 AS Level, x.Path + '/' + e.Name as Path,
    REVERSE(SUBSTRING( REVERSE(x.[Path]) ,0 , CHARINDEX( '/', REVERSE(x.[Path])) )) as [Parent]
 FROM krishtest e
 JOIN tb x ON x.id = e.parent1


)
SELECT Name, Level, Path, Parent FROM tb
Mostrar la mejor respuesta

Según lo comprometido, he intentado una respuesta.

No he proporcionado una solución real a su problema aquí. Pero recomendaría investigar Expresiones de tabla comunes recursivas. Eso debería permitirle encontrar todos los registros principales, luego puede ejecutar una eliminación en ellos.

https://technet.microsoft. com/en-us/library/ms186243(v=sql.105).aspx

¿Este uso está completo?

declare @tmp table (id int, Name varchar(10),Parent1 int,Parent2 int,Parent3 int,Parent4 int,Parent5 int)


insert into @tmp
SELECT 1,'Microsoft',NULL,NULL,NULL,NULL,NULL
union
SELECT 2,'Google',1,NULL,NULL,NULL,NULL
union
SELECT 3,'HP',NULL,2,NULL,NULL,NULL
union
SELECT 4,'Amazone',NULL,NULL,3,NULL,NULL
union
SELECT 5,'FB',NULL,NULL,NULL,4,NULL
 union
SELECT 6,'Yahoo',NULL,NULL,NULL,4,NULL
 union
SELECT 7,'Intel',NULL,NULL,2,NULL,NULL
union
SELECT 8,'Apple',7,5,NULL,NULL,NULL


select * from @tmp

;with name_tree as (
   select *
   from @tmp
   where id = 2 
   union all
   select c.*
   from @tmp c
     join name_tree p on (p.id = c.parent1 or p.id = c.parent2 or p.id = c.parent3 or p.id = c.parent4 or p.id = c.parent5)
) 


delete from t
from @tmp t
JOIN name_tree c on t.id=c.id

select * from @tmp

eso funcionó, pero ¿qué sucede si la columna de identificación de la clave principal de la tabla temporal tiene una relación de clave externa con otra tabla? La identificación de otra tabla está vinculada a tmp ->id. Entonces tenemos que eliminar ese primer bfr eliminando la fila de la tabla tmp. ¿Cómo resolver eso?

puedes hacer uniones y encontrar esas filas.

Simplemente puede modificar la cláusula where de CTE recursiva como en la consulta a continuación para obtener todas las filas que deben eliminarse.

Ver demostración en vivo

create table  krishtest (id int, name varchar(100), parent1  int, parent2  int)
insert into krishtest values
(1,'Microsoft', NULL, NULL),
(2,'Google',1,NULL),
(3,'HP',NULL,2),
(4,'amazon',3,NULL),
(5,'FB',NULL,4),
(6,'yahoo',3,NULL),
(7,'cisco',6,NULL)



;
WITH tb  (id,Name, Level, Path, Parent)
AS
(
 SELECT 
    id,Name, 1 AS Level, 
    CAST('/'+Name as nvarchar(max)) as Path,
    CAST(NULL as nvarchar(max)) as Parent
 FROM krishtest
 WHERE -- COALESCE(parent1,parent2) IS NULL
    name ='HP'

 UNION All

 SELECT 
    e.id,e.Name, x.Level + 1 AS Level, x.Path + '/' + e.Name as Path,
    REVERSE(SUBSTRING( REVERSE(x.[Path]) ,0 , CHARINDEX( '/', REVERSE(x.[Path])) )) as [Parent]
 FROM krishtest e
 JOIN tb x ON x.id = COALESCE(e.parent1,e.parent2)


)


   --delete FROM krishtest where id in( select id from tb)
   --select * from krishtest
   SELECT Name, Level, Path, Parent FROM tb