Postgresql:子查询在主查询中的行为不同是INSERT或DELETE

时间:2018-04-13 14:55:01

标签: postgresql subquery postgis

我在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 - [

0 个答案:

没有答案