我在Postgresql 10 + Postgis中对临时表运行了一个非常复杂的查询。
我有这个问题:
WITH isolatedPonctualBuildings AS
( -- sélection des bâtiments ponctuels qui n'ont pas de recoupement avec un bâtiment vectoriel
SELECT DISTINCT bat.pkid , bat.pkid_emprise, bat.origine , bat.origine_id, bat.geom
FROM Temp_batiments_sites AS bat
LEFT JOIN Temp_recoupements_bâtiments AS recoup
ON bat.pkid = recoup.pkid_batiment2
WHERE bat.type_geometry = 'Point'
AND recoup.pkid IS NULL --signifie que bat1 n'a pas été recoupé avec un bâtiment vectoriel
),
matchedPonctualBuildings AS
(
SELECT
DISTINCT ON (bat1.pkid, bat2.pkid)
bat1.pkid AS pkid_bat1, --bat1.pkid_site , bat1.pkid_emprise, bat1.origine , bat1.origine_id ,
bat2.pkid AS pkid_bat2 --, bat2.pkid_site , bat2. pkid_emprise, bat2.origine , bat2.origine_id
FROM isolatedPonctualBuildings AS bat1
JOIN isolatedPonctualBuildings AS bat2
ON bat1.pkid_emprise = bat2.pkid_emprise -- sur la même emprise, accèlere la requête
AND ST_Intersects (bat1.geom , bat2.geom) -- variante possible : ST_DWithin (bat1.geom , bat2.geom, 10) -- toute paire de bâtiments à moins de n mètres l'un de l'autre. Les tests sur le dép.67 ne montrent aucun recoupement à moins de 3 mètres.
AND ( bat1.origine != bat2.origine OR bat1.origine_id != bat2.origine_id )-- pour éviter les auto-jointures
)
SELECT pkid_bat1 , pkid_bat2 , 'B_and_B2_are_intersecting_points'
FROM matchedPonctualBuildings
;
它返回0行(这可能是正常的,我不确定)。 但现在我跑的时候:
WITH isolatedPonctualBuildings AS
( -- sélection des bâtiments ponctuels qui n'ont pas de recoupement avec un bâtiment vectoriel
SELECT DISTINCT bat.pkid , bat.pkid_emprise, bat.origine , bat.origine_id, bat.geom
FROM Temp_batiments_sites AS bat
LEFT JOIN Temp_recoupements_bâtiments AS recoup
ON bat.pkid = recoup.pkid_batiment2
WHERE bat.type_geometry = 'Point'
AND recoup.pkid IS NULL --signifie que bat1 n'a pas été recoupé avec un bâtiment vectoriel
),
matchedPonctualBuildings AS
(
SELECT
DISTINCT ON (bat1.pkid, bat2.pkid)
bat1.pkid AS pkid_bat1, --bat1.pkid_site , bat1.pkid_emprise, bat1.origine , bat1.origine_id ,
bat2.pkid AS pkid_bat2 --, bat2.pkid_site , bat2. pkid_emprise, bat2.origine , bat2.origine_id
FROM isolatedPonctualBuildings AS bat1
JOIN isolatedPonctualBuildings AS bat2
ON bat1.pkid_emprise = bat2.pkid_emprise -- sur la même emprise, accèlre la requête
AND ST_Intersects (bat1.geom , bat2.geom) -- variante possible : ST_DWithin (bat1.geom , bat2.geom, 10) -- toute paire de bâtiments à moins de n mètres l'un de l'autre. Les tests sur le dép.67 ne montrent aucun recoupement à moins de 3 mètres.
AND ( bat1.origine != bat2.origine OR bat1.origine_id != bat2.origine_id )-- pour éviter les auto-jointures
)
INSERT INTO Temp_recoupements_bâtiments
(pkid_batiment1 , pkid_batiment2 , type_recoupement)
SELECT pkid_bat1 , pkid_bat2 , 'B_and_B2_are_intersecting_points' AS type_recoupement
FROM matchedPonctualBuildings
;
除了最后4行(子查询matchesPonctualBuildings的结果用于除SELECT之外的INSERT)之外是相同的,它会插入数千行。
这到底怎么可能?! 8 - [