There seem to be several problems you are talking about.
Let's take the simplest one first.
If you are trying to replace this query:
Code:
select * from school s, subitem si where (s.id = si.school_id and si.item_id = 1)
with this query:
Code:
select * from school s where s.id in (select h.school_id from heating_system)
,
the obvious solution is to create a view called "heating system" that is based on school_items and subitem.
Another problem that you are concerned about seems to relate to the ability of end-users to add, for example, "Heating System D".
That can be done in several ways. One way is to provide a button that lets the user add the information, and then the application does the required work behind the scene. In this case, it would add a record to the subitem table and one more to the school_items table.
I am not convinced that the item and subitem tables are designed properly. The school_items table seems to suggest that the subitem_id must be unique in subitem table. Yet there is no such constraint that I can see.
Ravi