Today I have a short tip about PostgreSQL. Some time ago I needed to delete from a table all rows satisfying a certain condition involving another table. It turns out that it is not possible to use join in a delete statement – but there is a way around it (in fact, even two).
Let us assume that we have a table called person with columns person_id and city_id. We also have a table called city, with columns city_id and population. For the sake of a contrived example, we want to delete all people from cities with less than one million inhabitants from our database.
create table city ( city_id integer primary key, name text, population integer ); create table person ( person_id integer primary key, email text, city_id integer references city ); insert into city (city_id, name, population) values (1, 'Warsaw', 1800000), (2, 'Cracow', 800000); insert into person (person_id, email, city_id) values (1, 'syrenka@warsaw.pl', 1), (2, 'krak@cracow.pl', 2), (3, 'smok.wawelski@jama.pl', 2);
The standard-compliant way to do this is simple:
delete from person
where
city_id in (
select
city_id
from
city
where
population < 1000000
);
It turns out that PostgreSQL has a nice extension which lets us do the same thing a bit more concisely:
delete from person using city where person.city_id = city.city_id and population < 1000000;
That’s it for today, happy deleting!