If the tables are so very different, then how can you union them? If they have different columns, you could likely make a master table and simply insert nulls for the fields of a certain type. Nulls generally take up little or no space in a database, so there's not real issue with lost space, and this query becomes much easier to build / run. Alternatively, you could always have a master table with just the common fields in it, and then three child tables with the other rows in each one, and then join to them when needed. Again, it makes this summary stuff much easier to do.
Also, a quick point. Unions do a unique operation across the result sets you get back. I.e. if the result of union produced two rows that were the same, the union would throw one away. For larger datasets, this can be quite expensive, and normally isn't needed. Use UNION ALL to prevent the unique step from being performed and to speed up your unions.