This recent post has a good solution to this problem. For your data the code looks like:
)) AS geom
FROM tableA AS a
CROSS JOIN LATERAL (
SELECT ST_Union(b.cobertura5) AS geom
FROM tableB AS b
WHERE ST_Intersects(a.geom, b.cobertura5)
) AS blade;
In PostGIS each polygon from table B is removed from each polygon from table A individually and the resulting difference is not cumulative. i.e. polygon B1 and B2 of table B are removed from two different instances of polygon A1 of table A producing two polygons instead of one.
The trick is to accumulate all the differences from table B for each polygon of table A. Cumulate here means aggregate. Unfortunately there is still no ST_Difference() aggregate function in PostGIS. But one has been developed in the PostGIS Addons, a set of advanced plpgsql functions for PostGIS..
So download the Addons and execute them in your database. This will enable those functions.
Then you can try this query:
SELECT ST_DifferenceAgg(tableA.geom, tableB.geom) geom
FROM tableA, tableB
WHERE ST_Intersects(tableA.geom, tableB.geom)
GROUP BY tableA.geom;