none
Delete correcto similar a este otro RRS feed

  • Pregunta

  • Hola a todos:

    Tengo un delete

    delete dbo.[puntos ganados] where pg2=2 and pg3 in (select ra0 from dbo.[recomendaciones alojamiento] where ra1=@id0)

    Suponiendo que @id0=12004 y hay dos registros en recomendaciones alojamiento con ese valor, entonces me sale un error

    La subconsulta ha devuelto más de un valor, lo que no es correcto cuando va a continuación de =, !=, <, <=, >, >= o cuando se utiliza como expresión.
    Se terminó la instrucción.

    Supongo que tengo que hacer bien el delete

    ¿Cómo hacer el delete si yo quiero eliminar los registros en puntos ganados cuyo pg3 sea igual al ra0 de los registros en recomendaciones alojamiento cuyo ra1=12004?

    Gracias de antemano


    • Editado volar.2014 domingo, 20 de septiembre de 2015 20:24
    domingo, 20 de septiembre de 2015 20:20

Respuestas

  • los triggers se obtienen con la sentencia que te pasé. que te devolviera un registro indica que había uno, aunque es raro que todos los valores estén a null.

    Al borrar y crear la tabla de nuevo se borran los triggers asociados, supongo que si vuelves a ejecutar un comando te dará 0 filas. que es lo que debería tener.

    Si te parece marca la(s)  respuestas que te hayan ayudado a encontrar y solucionar tu problema. De esta forma se cierra el hilo. (si no lo haré yo en unos días :)) en cualquier caso aquí nos  tienes si necesitas algo mas.


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    • Marcado como respuesta volar.2014 lunes, 21 de septiembre de 2015 14:56
    lunes, 21 de septiembre de 2015 11:33
    Moderador

Todas las respuestas

  • Hola volar.2014,

    La verdad que yo no veo nada raro en tu consulta, ¿no será que tienes algún trigger AFTER DELETE que se esté desencadenando y que sea el que esté disparando el error?. ¿El mensaje de error a que objeto hace referencia?

    Esperamos tu feed-back

    domingo, 20 de septiembre de 2015 21:35
  • delete p from dbo.[puntos ganados] p inner join dbo.[recomendaciones alojamiento] r on r.ra0=p.pg2 and r.ra1=@id0  where p.pg2=2 

    Como bien te dice wilams no hay ningún problema en ese query porque lo tienes con un in.. así que no debería fallar. sin embargo y por si acaso prueba así

    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    domingo, 20 de septiembre de 2015 21:48
    Moderador
  • Hola:

    Este es todo el procedimiento almacenado. No tengo ningún trigger.

    USE [Cresoliaza]
    GO
    /****** Object:  StoredProcedure [dbo].[quitar_obra]    Script Date: 21/09/2015 8:22:16 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[quitar_obra]
    	(
    	@obra tinyint,
    	@id0 int
    	)
    AS
    	set nocount on
    	begin tran
    		if @obra=1
    			begin
    				delete dbo.[puntos ganados] where pg2=2 and pg3 in (select ra0 from dbo.[recomendaciones alojamiento] where ra1=@id0)
    				delete dbo.[puntos ganados] where pg2=20 and pg3 in (select va0 from dbo.[valoraciones alojamiento] where va1=@id0)
    				delete dbo.alojamiento1 where a10=@id0
    			end
    		else if @obra=2 
    				begin
    					delete dbo.[puntos ganados] where pg2=3 and pg3 in (select ra0 from dbo.[recomendaciones amistad] where ra1=@id0)
    					delete dbo.[puntos ganados] where pg2=21 and pg3 in (select va0 from dbo.[valoraciones amistad] where va1=@id0)
    					delete dbo.amistad1 where a10=@id0
    				end
    				else if @obra=3 
    						begin
    							delete dbo.[puntos ganados] where pg2=4 and pg3 in (select ra0 from dbo.[recomendaciones aventura] where ra1=@id0)
    							delete dbo.[puntos ganados] where pg2=22 and pg3 in (select va0 from dbo.[valoraciones aventura] where va1=@id0)
    							delete dbo.aventura1 where a10=@id0
    						end
    					else if @obra=4 
    							begin
    								delete dbo.[puntos ganados] where pg2=5 and pg3 in (select rb0 from dbo.[recomendaciones bebes] where rb1=@id0)
    								delete dbo.[puntos ganados] where pg2=23 and pg3 in (select vb0 from dbo.[valoraciones bebes] where vb1=@id0)
    								delete dbo.bebes1 where b10=@id0
    							end
    						else if @obra=5
    								begin
    									delete dbo.[puntos ganados] where pg2=6 and pg3 in (select rc0 from dbo.[recomendaciones ciencia] where rc1=@id0)
    									delete dbo.[puntos ganados] where pg2=24 and pg3 in (select vc0 from dbo.[valoraciones ciencia] where vc1=@id0)
    									delete dbo.ciencia1 where c10=@id0
    								end
    							else if @obra=6
    									begin
    										delete dbo.[puntos ganados] where pg2=7 and pg3 in (select rd0 from dbo.[recomendaciones deportes] where rd1=@id0)
    										delete dbo.[puntos ganados] where pg2=25 and pg3 in (select vd0 from dbo.[valoraciones deportes] where vd1=@id0)
    										delete dbo.deportes1 where d10=@id0
    									end
    									else if @obra=7
    											begin
    												delete dbo.[puntos ganados] where pg2=8 and pg3 in (select re0 from dbo.[recomendaciones electronica] where re1=@id0)
    												delete dbo.[puntos ganados] where pg2=26 and pg3 in (select ve0 from dbo.[valoraciones electronica] where ve1=@id0)
    												delete dbo.electronica1 where e10=@id0
    											end
    										else if @obra=8
    												begin
    													delete dbo.[puntos ganados] where pg2=9 and pg3 in (select rf0 from dbo.[recomendaciones fotografia] where rf1=@id0)
    													delete dbo.[puntos ganados] where pg2=27 and pg3 in (select vf0 from dbo.[valoraciones fotografia] where vf1=@id0)
    													delete dbo.fotografia1 where f10=@id0
    												end
    											else if @obra=9
    													begin
    														delete dbo.[puntos ganados] where pg2=10 and pg3 in (select rg0 from dbo.[recomendaciones gastronomia] where rg1=@id0)
    														delete dbo.[puntos ganados] where pg2=28 and pg3 in (select vg0 from dbo.[valoraciones gastronomia] where vg1=@id0)
    														delete dbo.gastronomia1 where g10=@id0
    													end
    												else if @obra=10
    														begin
    															delete dbo.[puntos ganados] where pg2=11 and pg3 in (select rh0 from dbo.[recomendaciones hombres] where rh1=@id0)
    															delete dbo.[puntos ganados] where pg2=29 and pg3 in (select vh0 from dbo.[valoraciones hombres] where vh1=@id0)
    															delete dbo.hombres1 where h10=@id0
    														end
    														else if @obra=11
    																begin
    																	delete dbo.[puntos ganados] where pg2=12 and pg3 in (select rl0 from dbo.[recomendaciones literatura] where rl1=@id0)
    																	delete dbo.[puntos ganados] where pg2=30 and pg3 in (select vl0 from dbo.[valoraciones literatura] where vl1=@id0)
    																	delete dbo.literatura1 where l10=@id0
    																end
    															else if @obra=12
    																	begin
    																		delete dbo.[puntos ganados] where pg2=13 and pg3 in (select rm0 from dbo.[recomendaciones musica] where rm1=@id0)
    																		delete dbo.[puntos ganados] where pg2=31 and pg3 in (select vm0 from dbo.[valoraciones musica] where vm1=@id0)
    																		delete dbo.mujeres1 where m10=@id0
    																	end
    																else if @obra=13
    																		begin
    																			delete dbo.[puntos ganados] where pg2=14 and pg3 in (select rm0 from dbo.[recomendaciones musica] where rm1=@id0)
    																			delete dbo.[puntos ganados] where pg2=32 and pg3 in (select vm0 from dbo.[valoraciones musica] where vm1=@id0)
    																			delete dbo.musica1 where m10=@id0
    																		end
    																	else if @obra=14
    																			begin
    																				delete dbo.[puntos ganados] where pg2=15 and pg3 in (select rn0 from dbo.[recomendaciones ninos] where rn1=@id0)
    																				delete dbo.[puntos ganados] where pg2=33 and pg3 in (select vn0 from dbo.[valoraciones ninos] where vn1=@id0)
    																				delete dbo.ninos1 where n10=@id0
    																			end
    																			else if @obra=15
    																					begin
    																						delete dbo.[puntos ganados] where pg2=16 and pg3 in (select rr0 from dbo.[recomendaciones restaurantes] where rr1=@id0)
    																						delete dbo.[puntos ganados] where pg2=34 and pg3 in (select vr0 from dbo.[valoraciones restaurantes] where vr1=@id0)
    																						delete dbo.restaurantes1 where r10=@id0
    																					end
    																				else if @obra=16
    																						begin
    																							delete dbo.[puntos ganados] where pg2=17 and pg3 in (select rr0 from dbo.[recomendaciones ropa] where rr1=@id0)
    																							delete dbo.[puntos ganados] where pg2=35 and pg3 in (select vr0 from dbo.[valoraciones ropa] where vr1=@id0)
    																							delete dbo.ropa1 where r10=@id0
    																						end
    																					 else if @obra=17
    																							begin
    																								delete dbo.[puntos ganados] where pg2=18 and pg3 in (select rs0 from dbo.[recomendaciones salud] where rs1=@id0)
    																								delete dbo.[puntos ganados] where pg2=36 and pg3 in (select vs0 from dbo.[valoraciones salud] where vs1=@id0)
    																								delete dbo.salud1 where s10=@id0
    																							end
    																						  else
    																								begin
    																									delete dbo.[puntos ganados] where pg2=19 and pg3 in (select rv0 from dbo.[recomendaciones viajes] where rv1=@id0)
    																									delete dbo.[puntos ganados] where pg2=37 and pg3 in (select vv0 from dbo.[valoraciones viajes] where vv1=@id0)
    																									delete dbo.viajes1 where v10=@id0
    																								end
    		delete dbo.[puntos ganados] where pg2=1 and pg3 in (select sp0 from dbo.[solicitudes publicaciones] where sp1=@obra and sp2=@id0)
    		delete dbo.[puntos usados] where pu1 in (select sp0 from dbo.[solicitudes publicaciones] where sp1=@obra and sp2=@id0)
    		delete from dbo.[solicitudes publicaciones] where sp1=@obra and sp2=@id0
    	commit tran

    obra=1. Lo he ejecutado de nuevo. Me da el error que puse antes. ¿Qué falla?

    Gracias de antemano.



    • Editado volar.2014 lunes, 21 de septiembre de 2015 7:12
    lunes, 21 de septiembre de 2015 6:26
  • Creo que todo tu procedimiento se podría quedar en esto

    /****** Object:  StoredProcedure [dbo].[quitar_obra]    Script Date: 21/09/2015 8:22:16 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[quitar_obra]
    	(
    	@obra tinyint,
    	@id0 int
    	)
    AS
    	set nocount on
    	begin tran
    	delete dbo.[puntos ganados] where pg2=@obra+1 and pg3 in (select ra0 from dbo.[recomendaciones alojamiento] where ra1=@id0)
    	delete dbo.[puntos ganados] where pg2=@obra+19 and pg3 in (select ra0 from dbo.[recomendaciones alojamiento] where ra1=@id0)
    	delete dbo.alojamiento1 where a10=@id0
    	delete dbo.[puntos ganados] where pg2=1 and pg3 in (select sp0 from dbo.[solicitudes publicaciones] where sp1=@obra and sp2=@id0)
    	delete dbo.[puntos usados] where pu1 in (select sp0 from dbo.[solicitudes publicaciones] where sp1=@obra and sp2=@id0)
    	delete from dbo.[solicitudes publicaciones] where sp1=@obra and sp2=@id0
    	commit tran

    ¿puedes intentar ejecutar una a una las instrucciones y decirnos donde da el error?

    No tiene sentido que lo de. asegúrate de que no hay triggers


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    lunes, 21 de septiembre de 2015 6:38
    Moderador
  • Hola de nuevo:

    He ejecutado cada instrucción por separado. Y el error lo da en

    delete dbo.alojamiento1 where a10=@id0

    Tengo otra tabla alojamiento2. En ella tengo un campo, a21,que es una clave externa. La relaciónn es alojamiento1 y alojamiento2 on a10=a21

    @id0=12004. En alojamiento1 hay un registro con a10=12004. En alojamiento2, la tabla relacionada, hay 4 registros con a21=12004

    Tengo puesto un borrado en cascada. A ver si es eso. ¿Podeis decirme?

    Gracias



    • Editado volar.2014 lunes, 21 de septiembre de 2015 8:20
    lunes, 21 de septiembre de 2015 7:33
  • me extrañaría que fuese el borrado en cascada, tiene mas pinta de ser un trigger.

    lo has comprobado?!

    como ves ahí no puede haber más de una fila...


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    lunes, 21 de septiembre de 2015 7:55
    Moderador
  • Hola:

    Parece ser que en alojamiento2 no puede haber más de una fila. ¿Es posible? ¿No es una relación uno a varios? ¿Cómo se lo digo?

    Gracias

    lunes, 21 de septiembre de 2015 8:25
  • a ver.. no tengo idea de como lo has creado, pero eso no puede ser el error. Si miras este ejemplo verás que se borra y se borra bien sin dar error.

    Insisto en que probablemente haya un trigger.

    use tempdb
    go
    create table cabecera(id int not null primary key, foo char(10));
    create table lineas(idlinea int not null, idcabecera int not null, foo char(10),
    constraint pk_lineas primary key (idcabecera,idlinea),
    constraint fk_lineas_cabecera foreign key (idCabecera) references Cabecera(id) on delete cascade);
    go
    insert into cabecera values (1,'');
    insert into lineas values(1,1,''),(2,1,''),(3,1,'');
    go
    select * from cabecera;
    select * from lineas;
    go
    delete from cabecera where id=1;
    go
    select * from cabecera;
    select * from lineas;
    


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    lunes, 21 de septiembre de 2015 8:35
    Moderador
  • Hola de nuevo:

    Estoy ejecutando la instrucción

    delete dbo.alojamiento1 where a10=12004

    He quitado la relación. Y me sigue dando el error. No hay trigger. ¿Qué puede fallar?

    lunes, 21 de septiembre de 2015 8:41
  • ejecuta este query y dinos que te sale

    select  * from sys.sysobjects where xtype='tr' and parent_obj in (select id from sysobjects where name ='alojamiento1')


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    lunes, 21 de septiembre de 2015 9:26
    Moderador
  • Hola:

    He ejecutado la sentencia que dices. Me da un registro con todos los valores a null.

    He recreado la tabla alojamientos1. Ahora va bien.

    Me gustaría saber cómo obtener los triggers, aunque creo que no hay ninguno.

    Gracias.


    • Editado volar.2014 lunes, 21 de septiembre de 2015 10:57
    lunes, 21 de septiembre de 2015 10:53
  • los triggers se obtienen con la sentencia que te pasé. que te devolviera un registro indica que había uno, aunque es raro que todos los valores estén a null.

    Al borrar y crear la tabla de nuevo se borran los triggers asociados, supongo que si vuelves a ejecutar un comando te dará 0 filas. que es lo que debería tener.

    Si te parece marca la(s)  respuestas que te hayan ayudado a encontrar y solucionar tu problema. De esta forma se cierra el hilo. (si no lo haré yo en unos días :)) en cualquier caso aquí nos  tienes si necesitas algo mas.


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    • Marcado como respuesta volar.2014 lunes, 21 de septiembre de 2015 14:56
    lunes, 21 de septiembre de 2015 11:33
    Moderador