Дмитрий, запустил ваш скрипт после пары import'ов, но к сожалению не увидел визуального изменения слоя, может быть что-то делаю не так? Поле id - есть, в скрипте изменил слой test на свой
Спойлер
Код: Выделить всё
from qgis.PyQt.QtCore import *
from qgis.utils import iface
from qgis.core import *
srcLayer = iface.activeLayer()
dstLayerName = 'SelfSymDifference'
idName = 'idSelfSymDifference'
srcLayer.startEditing()
myField = QgsField(idName, QVariant.Int )
srcLayer.addAttribute( myField )
srcLayer.updateFields()
idx = srcLayer.fieldNameIndex(idName)
i = 0
for f in srcLayer.getFeatures():
    f[idx] = i
    i += 1
    srcLayer.updateFeature( f )
srcLayer.commitChanges()
tpl = '''
With CTE AS(
    SELECT '1' AS grp, st_union(st_intersection(a.geometry, b.geometry)) as geometry 
    FROM %s a JOIN WV2_B45_20160625_C_NDVI_F165_S_Sieve_Convexhull-9 b ON (
        (a.%s < b.%s)and
        (a.geometry is NOT NULL)and
        (b.geometry is NOT NULL)and
        (st_intersects(a.geometry, b.geometry))
    ) 
    GROUP BY grp
) 
SELECT st_difference(WV2_B45_20160625_C_NDVI_F165_S_Sieve_Convexhull-9.geometry, CTE.geometry) FROM %s
JOIN CTE'''
sql = tpl % (srcLayer.name(), idName, idName, srcLayer.name())
layer = QgsVectorLayer("?query="+sql, dstLayerName, "virtual")
QgsMapLayerRegistry.instance().addMapLayer(layer, True)Что могло пойти не так?