Re: [firebird-support] Performance of deleting records based on another table

2019-09-03 Thread Joost van der Sluis jo...@cnoc.nl [firebird-support]
On 8/28/19 6:47 AM, Kjell Rilbe kjell.ri...@marknadsinformation.se 
[firebird-support] wrote:
> Den 2019-08-17 kl. 12:51, skrev Joost van der Sluis jo...@cnoc.nl
> [firebird-support]:
>  >
>  > Hi all,
>  >
>  > I finally realized today that I do not know how to properly remove
>  > records based on another table.
>  >
>  > Suppose I have two tables, one with data (called BIG), and one table
>  > (SMALL) with only some id's that has to be removed from the BIG-table.
>  >
>  > I cannot get this to work, without having Firebird looping over all
>  > records in BIG naturally, once for each record in SMALL.
>  >
> 
> This is a problem I have faced many times. The best solution I've been
> able to find is an execute block statement that iterates the records in
> SMALL and uses a "delete ... where big.id = :found_small_id" statement
> to delete each matching BIG record. Something like this (including set
> term if required for your SQL tool):
> 
> set term #;
> execute block as
> declare id int;
> begin
>    for select small.id from small into :id
>    do delete from big where id = :id;
> end#
> set term ;#

Thanks for the confirmation. I still find it strange, though. Would be 
nice if someone could come up with a solution for this. By improving the 
planning-engine (or how it is called).

Or maybe adapt 'merge' so it also allows deletes.

Regards,

Joost.


Re: [firebird-support] Performance of deleting records based on another table

2019-08-27 Thread Kjell Rilbe kjell.ri...@marknadsinformation.se [firebird-support]
Den 2019-08-17 kl. 12:51, skrev Joost van der Sluis jo...@cnoc.nl 
[firebird-support]:
>
> Hi all,
>
> I finally realized today that I do not know how to properly remove
> records based on another table.
>
> Suppose I have two tables, one with data (called BIG), and one table
> (SMALL) with only some id's that has to be removed from the BIG-table.
>
> I cannot get this to work, without having Firebird looping over all
> records in BIG naturally, once for each record in SMALL.
>

This is a problem I have faced many times. The best solution I've been 
able to find is an execute block statement that iterates the records in 
SMALL and uses a "delete ... where big.id = :found_small_id" statement 
to delete each matching BIG record. Something like this (including set 
term if required for your SQL tool):

set term #;
execute block as
declare id int;
begin
   for select small.id from small into :id
   do delete from big where id = :id;
end#
set term ;#

Regards,
Kjell Rilbe



[Non-text portions of this message have been removed]