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