[Gfoss] Corretta creazione di una view spatialite

a.furieri a lqt.it a.furieri a lqt.it
Lun 7 Nov 2016 22:40:23 CET


On Mon, 7 Nov 2016 21:31:02 +0100, Luca Mandolesi wrote:
> Salve a tutti,
> chiedo un parere di tipo concettuale su una view spatialite.
>
> Se ho una tabella di tipo punto alla quale corrispondo tramite pkid e 
> fkid
> dei record in una tabella alfanumerica.
>
> Quindi per 1 punto N record alfanumerici.
>
> Ho creato una view a partire dalla  tabella alfanumerica e tramite 
> gli id
> gli collego il campo geometrico.
>
> Mi aspetto di avere una tabella con tutti i record alfanumerici con
> collegati i punti che in un visualizzatore appaiono 3 punti e la 
> tabella ne
> rispecchi la struttura.
>
> Con Qgis ottengo invece questo risultato di visualizzazione
>
> 
> https://www.dropbox.com/sh/00podqheenurjh1/AAAxWmia3kpFgf07jz1clskxa?dl=
> 0&preview=bug_view.PNG
>
> Qui c'รจ il DB che ho creato:
> 
> https://www.dropbox.com/sh/00podqheenurjh1/AAAxWmia3kpFgf07jz1clskxa?dl=0
>
> Prima di segnalare il bug vorrei avere un parere lato spatialite.
>

Luca,

mi pare che la tua Spatial View sia concettualmente errata:
questo e' il codice SQL che stai usando:

CREATE VIEW edifici_materiali_view AS
SELECT a.ROWID AS ROWID, a. pkuid AS pkuid,
     a.tipo_edificio AS tipo_edificio, a.grado_rischio AS grado_rischio,
     a.geom AS geom, b.ROWID AS ROWID_1,
     b.id_mat_pk AS id_mat_pk, b.tipo_materiale AS tipo_materiale,
     b.id_ed_fk AS id_ed_fk
FROM edifici AS a
JOIN materiali AS b ON (a.pkuid = b.id_ed_fk);

da cui risulta chiarissimo che ROWID corrisponde alla PK di
"edifici", mentre ROWID_1 corrisponde alla PK di "materiali".

giusto un commento: entrambe le tavole hanno una PK
debitamente dichiarata, cioe' rispettivamente
edifici.pkuid e materiali.id_mat_pk, e sono ambedue
di tipo INTEGER.
che bisogno hai di tirarti dietro _anche_ i ROWID di
queste due tavole ?
per SQLite quando esiste una PK di tipo INTEGER e'
implicito che quel valore diventa anche automaticamente
il valore del ROWID; in sostanza, ti stai tirando dietro
due doppioni ridondanti e quindi del tutto inutili.

comunque, il problema non e' qua.
il problema nasce quando sei andato a registrare quella
view dentro alla meta-tavola "view_geometry_columns".
qua tu hai assegnato alla colonna "view_rowid" il
valore "rowid_1".
ma come abbiamo visto prima rowid_1 corrisponde alla PK
della tavola "materiali" che e' una tavola non-spatial,
e da li si scatena tutto il pasticcio.

su "view_rowid" devi necessariamente registrare la PK
della tavola che fornisce le geometrie: e quindi nel
tuo caso "pkuid" (o come alias "rowid", ma e' sempre
meglio usare il nome vero piuttosto che l'alias).

per inciso: la tua view crea tre righe che pero'
coincidono con un singolo punto; e' proprio quello
che volevi ottenere ?

in genere le view si usano nell'altro modo; per
ciascuna singola geometria si associano ulteriori
attributi contenuti in una seconda tavola; tu
invece stai facendo l'opposto, crei tante righe
diverse ma tutte quante con la medesima geometria).

ciao Sandro











Maggiori informazioni sulla lista Gfoss