Delete rows in table A where condition in table B

Table A (id_A, value_A) Table B (id_B, value_B1, value_B2)
id1 web1.com
id2 web2.net
id1 web1 com
id2 web2 com

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