--- /dev/null
+/*
+Remove all browse entries that are not linked to either a bib record
+(via metabib.browse_*_entry_def_map) or an authority record (via
+(metabib.browse_*_entry_simple_heading_map).
+
+Stale browse entries are never removed by the code. They just languish.
+Run this script after a browse entry re-ingest, particularly if browse
+indexes change, resulting in a lot of new browse entries.
+*/
+
+DELETE FROM metabib.browse_author_entry WHERE id IN (
+ SELECT DISTINCT(entry.id)
+ FROM metabib.browse_author_entry entry
+ LEFT JOIN metabib.browse_author_entry_def_map map
+ ON (map.entry = entry.id)
+ LEFT JOIN metabib.browse_author_entry_simple_heading_map hmap
+ ON (hmap.entry = entry.id)
+ WHERE map.id IS NULL AND hmap.id IS NULL
+);
+
+DELETE FROM metabib.browse_author_entry WHERE id IN (
+ SELECT DISTINCT(entry.id)
+ FROM metabib.browse_author_entry entry
+ LEFT JOIN metabib.browse_author_entry_def_map map
+ ON (map.entry = entry.id)
+ LEFT JOIN metabib.browse_author_entry_simple_heading_map hmap
+ ON (hmap.entry = entry.id)
+ WHERE map.id IS NULL AND hmap.id IS NULL
+);
+
+DELETE FROM metabib.browse_series_entry WHERE id IN (
+ SELECT DISTINCT(entry.id)
+ FROM metabib.browse_series_entry entry
+ LEFT JOIN metabib.browse_series_entry_def_map map
+ ON (map.entry = entry.id)
+ LEFT JOIN metabib.browse_series_entry_simple_heading_map hmap
+ ON (hmap.entry = entry.id)
+ WHERE map.id IS NULL AND hmap.id IS NULL
+);
+
+DELETE FROM metabib.browse_title_entry WHERE id IN (
+ SELECT DISTINCT(entry.id)
+ FROM metabib.browse_title_entry entry
+ LEFT JOIN metabib.browse_title_entry_def_map map
+ ON (map.entry = entry.id)
+ LEFT JOIN metabib.browse_title_entry_simple_heading_map hmap
+ ON (hmap.entry = entry.id)
+ WHERE map.id IS NULL AND hmap.id IS NULL
+);
+
+
+DELETE FROM metabib.browse_call_number_entry WHERE id IN (
+ SELECT DISTINCT(entry.id)
+ FROM metabib.browse_call_number_entry entry
+ LEFT JOIN metabib.browse_call_number_entry_def_map map
+ ON (map.entry = entry.id)
+ WHERE map.id IS NULL
+ -- no simple_heading_map for call numbers
+);
+