Delete rows in table A where condition in table B
Table A (id_A, value_A) | Table B (id_B, value_B1, value_B2) |
|
|
---|
We want delete
A(id1; web1.com)
Because it like
B(id1; web1; com)
when concatenated
pseudo SQL
DELETE from table A WHERE id_A = id_B AND value_A = (value_B1 concatenate to with value_B2)
SYBASE:
using a temporary table for B
SELECT id_B, value_B1 || "." || value_B2 AS value_B INTO #B_temp /* use # prefix for temporary table */ FROM B DELETE A FROM A AS a, #B_temp AS b_tmp WHERE a.id_A = b_tmp.id_B AND a.value_A = b_tmp.value_B DROP TABLE #B_temp GO
using procedure
/**********/ /* create procedure named "delete_row" */ /**********/ PRINT 'Create procedure delete_row ...' GO CREATE PROC delete_row AS DECLARE @in_trans tinyint, @id_B int, /* store id_B in table B*/ @value_B varchar(255) /* store value_B1 and value_B2 in table B*/ SELECT @in_trans = 0, @id_B = 0, @value_B = NULL BEGIN TRANSACTION migrate IF @@error <> 0 BEGIN GOTO error END ELSE SELECT @in_trans = 1 DECLARE cur_B CURSOR FOR SELECT id_B, value_B1 + '.' + value_B2 FROM B /* cur_B store record */ /* just like a temporary table like #B_temp above */ OPEN cur_B IF @@error <> 0 OR @@sqlstatus = 1 BEGIN GOTO error END FETCH cur_B INTO @id_B, @value_B IF @@error <> 0 OR @@sqlstatus = 1 BEGIN GOTO error END WHILE @@sqlstatus = 0 BEGIN DELETE FROM A WHERE id_A = @id_B AND value_A = @value_B FETCH cur_B INTO @id_B, @value_B IF @@error <> 0 OR @@sqlstatus = 1 BEGIN GOTO error END END COMMIT TRANSACTION migrate RETURN 0 error: IF @in_trans = 1 ROLLBACK TRANSACTION migrate RETURN -1 GO /**********/ /* Main */ /**********/ DECLARE @retcode int /* Initialize */ SELECT @retcode=0 EXEC @retcode = delete_row IF @@error <> 0 OR @retcode <> 0 BEGIN GOTO error END PRINT 'SUCCESSFULLY COMPLETED' error: PRINT 'ERROR' GO /*********************8888888888888888888****/ /* Drop stored procedures used in migration */ /******************88888888888888888*********/ PRINT 'Dropping proc delete_row...' GO IF EXISTS (SELECT 1 FROM sysobjects WHERE name = 'delete_row') DROP PROC delete_row GO exit
ORACLE:
using DROWID
DELETE FROM A WHERE ROWID IN ( SELECT a.ROWID FROM A a, B b WHERE a.id_A = b.id_B AND a.value_A = b.value_B1 || "." || b.value_B2 )
using procedure
set def on set feedback off set serveroutput on set linesize 180 /*******************************/ /* Script that deletes row /******************************/ EXEC DBMS_OUTPUT.PUT_LINE('Deleting row...') DECLARE BEGIN DECLARE CURSOR cur_A IS SELECT a.id_A, a.value_A FROM A a, B b WHERE a.id_A = b.id_B AND a.value_A = b.value_B1||'.'||b.value_B2 FOR UPDATE; BEGIN FOR a_rec IN cur_A LOOP DELETE FROM A WHERE id_A = a_rec.id_A AND value_A = a_rec.value_A; END LOOP; END; EXCEPTION WHEN OTHERS THEN NULL; END; / exit
DELETE participial value
pseudo SQL
DELETE from table A WHERE id_A = id_B AND value_A = 'web1.com'
Both ORACLE and SYBASE
DELETE from A WHERE EXISTS (SELECT * FROM A tA, B tB WHERE tA.id_A = tB.id_B) AND value_A = 'web1.com'
Note:
This sql statement only run on SYBASE, not on ORACLE (not allow AS alias)
DELETE A from A AS tA, B AS tB WHERE tA.id_A = tB.id_B AND tA.value_A = 'web1.com'
Loading