I wasn't able to find a solution to this either in the forums or with web searches, so I've now manually altered the database. The problem was that only half of the blogs upgraded when I ran the upgrade script. I still have no idea why some blogs were skipped, and that probably warrants more attention.
The fix involved deleting (actually renaming) three tables which were in the old information schema, and then updating a further four tables with information which was in the tables from a correctly updated blog. I'm supplying the code here in case its useful to anyone else. HOWEVER please don't just run it on your database, this is an EXAMPLE only, and will need to be edited before you run it on your own database. For the record I'm trying to update blog number _2_ and filling the blogroll with data from blog number _70_ which was correctly updated.
RENAME TABLE wp_2_categories TO zz_2_categories, wp_2_link2cat TO zz_2_link2cat, wp_2_post2cat to zz_2_post2cat;
DROP TABLE wp_2_links;
CREATE TABLE wp_2_links ( link_id bigint( 20 ) NOT NULL auto_increment ,
link_url varchar( 255 ) NOT NULL default '',
link_name varchar( 255 ) NOT NULL default '',
link_image varchar( 255 ) NOT NULL default '',
link_target varchar( 25 ) NOT NULL default '',
link_category bigint( 20 ) NOT NULL default '0',
link_description varchar( 255 ) NOT NULL default '',
link_visible enum( 'Y', 'N' ) NOT NULL default 'Y',
link_owner int( 11 ) NOT NULL default '1',
link_rating int( 11 ) NOT NULL default '0',
link_updated datetime NOT NULL default '0000-00-00 00:00:00',
link_rel varchar( 255 ) NOT NULL default '',
link_notes mediumtext NOT NULL ,
link_rss varchar( 255 ) NOT NULL default '',
PRIMARY KEY ( link_id ) ,
KEY link_category ( link_category ) ,
KEY link_visible ( link_visible ) ) ENGINE = MyISAM DEFAULT CHARSET = utf8;
INSERT INTO wp_2_links SELECT * FROM wp_70_links;
CREATE TABLE wp_2_terms ( term_id bigint( 20 ) NOT NULL auto_increment ,
name varchar( 55 ) NOT NULL default '',
slug varchar( 200 ) NOT NULL default '',
term_group bigint( 10 ) NOT NULL default '0',
PRIMARY KEY ( term_id ) ,
UNIQUE KEY slug ( slug ) ) ENGINE = MyISAM DEFAULT CHARSET = utf8;
INSERT INTO wp_2_terms SELECT * FROM wp_70_terms;
CREATE TABLE wp_2_term_relationships ( object_id bigint( 20 ) NOT NULL default '0',
term_taxonomy_id bigint( 20 ) NOT NULL default '0',
PRIMARY KEY ( object_id , term_taxonomy_id ) ,
KEY term_taxonomy_id ( term_taxonomy_id ) ) ENGINE = MyISAM DEFAULT CHARSET = utf8;
INSERT INTO wp_2_term_relationships SELECT * FROM wp_70_term_relationships;
CREATE TABLE wp_2_term_taxonomy ( term_taxonomy_id bigint( 20 ) NOT NULL auto_increment ,
term_id bigint( 20 ) NOT NULL default '0',
taxonomy varchar( 32 ) NOT NULL default '',
description longtext NOT NULL ,
parent bigint( 20 ) NOT NULL default '0',
count bigint( 20 ) NOT NULL default '0',
PRIMARY KEY ( term_taxonomy_id ) ,
UNIQUE KEY term_id_taxonomy ( term_id , taxonomy ) ) ENGINE = MyISAM DEFAULT CHARSET = utf8;
INSERT INTO wp_2_term_taxonomy SELECT * FROM wp_70_term_taxonomy;