I've been using the following code in PostgreSQL/PostGIS for the last year, as needed, which is about once a quarter. It works OK, it's just that it takes days to run. With over 25,000 parcels making up the county, maybe that's fine, but I'd like some expert input to see if there's a better way to do it.
An additional consideration, wetlandyn is a multi-polygon, the rest are single, though soils and luc could be converted to a multi-polygon.
Is querying against multi-polygons any more or less efficient than singles?
SELECT
parcels.pin AS "PIN",
soils.musym AS "Soils",
parcels.camacls as "CAMACLS",
luc.landcode as "Land Code",
wetlandyn.inwetland as "In Wetland (y/n)",
ROUND(((SUM(ST_AREA(ST_INTERSECTION((ST_INTERSECTION(parcels.geom,luc.geom)),
(ST_INTERSECTION(wetlandyn.geom,soils.geom)))))/ST_AREA(parcels.geom))*parcels.acres)::numeric,4) AS "Legal Soils"
FROM
soils,
luc,
parcels,
wetlandyn
WHERE
ST_INTERSECTS(parcels.geom, soils.geom)
AND
ST_INTERSECTS(parcels.geom, luc.geom)
AND
ST_INTERSECTS(parcels.geom, wetlandyn.geom)
AND
CAST(parcels.camacls AS int) >=100
AND
CAST(parcels.camacls AS int) <200
AND
parcels.acres > 0
AND
((ST_AREA(ST_INTERSECTION(ST_INTERSECTION(ST_INTERSECTION(parcels.geom,luc.geom),
ST_INTERSECTION(parcels.geom,soils.geom)),ST_INTERSECTION(parcels.geom,wetlandyn.geom)))/ST_AREA(parcels.geom))*parcels.acres)
>= 0.00005
GROUP BY
parcels.pin,
soils.musym,
parcels.camacls,
luc.landcode,
parcels.acres,
parcels.geom,
luc.geom,
soils.geom,
wetlandyn.geom,
wetlandyn.inwetland
ORDER BY
parcels.pin, soils.musym, luc.landcode