Probleme mit ST_Intersect

Hallo,

ich versuche aus mehreren Tabellen Gebäude innerhalb einer BoundingBox abzufragen.
Mit dem BoundingBox- Operator && funktioniert das gut (WHERE c.Geometry && ST_MakeEnvelope(3500060.29, 5392691.47, 3500277.065, 5393413.511))
Jetzt habe ich zu jedem Gebäude den Centroid berechnet. weil er dann ja nur noch eine Punktgeometrie hat und die räumliche Abfrage dann ja schneller gehen müsste.
Meine Abfrage sieht so aus:

--> verwendete Attribute
SELECT a.ID, b.ID, ST_AsGeoJSON(c.Geometry), d.Classname -- ST_AsGeoJSON() -> Konvertierung von Postgis intern in GeoJSON

--> Dateninput (verwendete Tabellen)
FROM  Building a, Thematic_Surface b, Surface_Geometry c, Objectclass d 

WHERE ST_Intersects(ST_MakeEnvelope(3500060.29, 5392691.47, 3500277.065, 5393413.511, 31467), a.centroid_geom)-- 500m BBox

AND a.ID = b.Building_ID -- Join rausfiltern der thematischen Einzelpolygone (Wall-, Roof-, ...) zu einem Gebäude
AND b.Lod2_Multi_Surface_ID = c.Root_ID -- Root_ID == ID des Elterneintrages und ist bei allen Einzelpolygonen gleich
AND c.Geometry IS NOT NULL -- rausfiltern der Elterngeometrie

AND b.Objectclass_ID = d.ID
ORDER BY a.ID

Er gibt mir jedoch aus der Tabelle a(building) alle Zeilen raus.
Das heißt er hat überhaupt keine Selektion gemacht.
Was ist an der Abfrage falsch?

Ich habe einen Fehler gefunden:
Der berechnete Centroid (a.centroid_geom) ist bei allen gleich. Das heißt die Erzeugung des Centroiden ist falsch:

--SELECT DropGeometryColumn ('citydb', 'building', 'centroid_geom');

SELECT AddGeometryColumn ('citydb', 'building', 'centroid_geom', 31467, 'point',2);

UPDATE "building" SET centroid_geom = ST_Centroid(c.geometry)

FROM  Building a, Thematic_Surface b, Surface_Geometry c

WHERE a.ID = b.Building_ID -- alle Polygone zu einem Gebäude
AND b.Objectclass_ID = 35 -- 35 ==GroundSurface
AND b.Lod2_Multi_Surface_ID = c.Root_ID -- Geometrie der einzelnen Polygone
AND c.Geometry IS NOT NULL -- rausfiltern der Elterngeometrie

Es sieht so aus als berechnet er einmal den Centroid und mittels Update fügt er überall den gleichen Wert ein.
Es muss aber in einer Loop erfolgen.
Weiß einer wie das geht?

Du vermurkst deine Join-conditions mit den eigentlichen Where-Conditions.

test=# select * from a;
 id | val 
----+-----
  1 |    
  2 |    
  3 |    
  4 |    
  5 |    
(5 rows)

test=*# select * from b;
 id | val 
----+-----
  1 |   1
  2 |   2
  3 |   3
  4 |   4
  5 |   5
(5 rows)

test=*# update a set val=b.val from a as a1, b where a1.id=b.id;
UPDATE 5
test=*# select * from a;
 id | val 
----+-----
  1 |   1
  2 |   1
  3 |   1
  4 |   1
  5 |   1
(5 rows)

test=*# rollback;
ROLLBACK
test=# update a set val=b.val from a as a1, b where a.id=b.id;
UPDATE 5
test=*# select * from a;
 id | val 
----+-----
  1 |   1
  2 |   2
  3 |   3
  4 |   4
  5 |   5
(5 rows)

test=*#

Finde den Unterschied!

alles klar habs !
danke