QGIS: join (unioni tabellari e non solo)

I dataset che utilizziamo nel nostro lavoro potrebbero essere incompleti oppure vogliamo semplicemente ampliarli con altri dati (es: csv, xls, ods ecc..) tramite una semplice ‘unione‘ di tabelle sfruttando un campo correlato. Questa operazione è conosciuta come Join tabellare: vediamo come funziona in QGIS.

Un po’ di teoria:

SQL JOIN

Una clausola JOIN viene utilizzata per combinare righe da due o più tabelle, in base a una colonna correlata tra di essi; ecco diversi tipi di JOIN in SQL:

  • (INTERNO) JOIN : restituisce i record che hanno valori corrispondenti in entrambe le tabelle
  • LEFT (OUTER) JOIN : restituisce tutti i record dalla tabella di sinistra e i record corrispondenti dalla tabella di destra
  • RIGHT (OUTER) JOIN : restituisce tutti i record dalla tabella di destra e i record corrispondenti dalla tabella sinistra
  • FULL (OUTER) JOIN : restituisce tutti i record quando c’è una corrispondenza nella tabella sinistra o destra
join_sql
schemi logici

QGIS, quale utilizza per fare la JOIN tabellare?

procediamo con degli esempi, cosi si capirà meglio:

Creare-tabelle-responsive-in-Wordpress
tabelle in JOIN – tabella di destra e di sinistra

date due tabelle (come in figura) chiameremo la prima tabella: tabella di sinistra (SX) e la seconda: tabella di destra (DX).

 I casi possibili sono:

la tabella di SX ha ‘n’ righe e quella di DX ha ‘m’ righe:

  1. n = m; (situazione ideale)
  2. n < m;
  3. n > m;

Analizziamo il primo caso n = m :

la colonna correlata è CIR_ID, realizziamo la JOIN in QGIS:

JOIN1
join

dopo OK, ecco la tabella di SX:

tabe_sx_join
Tabella di SX dopo JOIN

quindi il numero di righe della tabella di SX è uguale al numero di righe della tabella di DX: rientriamo nel caso:

  • LEFT (OUTER) JOIN : restituisce tutti i record dalla tabella di sinistra e i record corrispondenti dalla tabella di destra.

Analizziamo il primo caso n < m :

aggiungo due record alla tabella di DX:

tab_sx_mod1
tabella di DX con due righe in più rispetto alla tabella di SX

ripeto la stessa procedura per realizzare la JOIN in QGIS:

JOIN_3
join

dopo OK, ecco la tabella di SX:

tabe_sx_join3
tabella di SX dopo JOIN

quindi il numero di righe della tabella di SX è rimasta uguale (8 righe) e il numero di righe della tabella di DX (10) corrispondono secondo la colonna correlata: rientriamo nel caso:

  • LEFT (OUTER) JOIN : restituisce tutti i record dalla tabella di sinistra e i record corrispondenti dalla tabella di destra.

Analizziamo il secondo caso n > m :

sottraggo due record alla tabella di DX in modo da avere solo 6 record:

tab_dx_mod2
tabella di DX – senza la riga 4 e 7

ripeto la stessa procedura per realizzare la JOIN in QGIS e ottengo:

tabe_sx_join4
tabella di SX dopo JOIN

quindi il numero di righe della tabella di SX è rimasta uguale (8 righe) e il numero di righe della tabella di DX (6) corrispondono secondo la colonna correlata, dove manca la correlazione viene messo NULL in modo da NON modificare il numero di righe della tabella di SX: rientriamo nel caso:

  • LEFT (OUTER) JOIN : restituisce tutti i record dalla tabella di sinistra e i record corrispondenti dalla tabella di destra.

 

CONCLUDENDO: la JOIN tabellare in QGIS è una LEFT JOIN

Immagine002

Il numero di righe della tabella di SX NON cambierà mai sarà, di volta in volta, il numero di righe della tabella in JOIN (quella di DX) ad adeguarsi alla tabella di SX.

Buon lavoro!!!

 


PS: da un sondaggio (fatto per scherzare, quindi non ha molto valore) , durato 24 ore e somministrato in un gruppo in cui si parla di GIS (e in particolare di QGIS), su un totale di 21 risposte il 43% NON sa che la JOIN utilizzata da QGIS è una LEFT JOIN.

15 pensieri su “QGIS: join (unioni tabellari e non solo)

  1. Buongiorno, l’articolo è interessante, ma c’è, secondo me un errore. Ricontro infatti che se ho una tabella A con dati geometrici e tramite una chiave la metto in relazione con una tabella B di dati non geometrici (foglio excel) ottengo una tabella che ha come nr di record quelli della tabella A: alcuni valorizzati altri a NULL. Questo però anche se nella seconda tabella ho più volte l’elemento chiave (ad esempio sulla stessa particella ci sono più record). Pertanto questo NON è il comportamento di un LEFT OUTER JOIN, il quale invece andrebbe a ridondare i record della tabella A (lo farebbe anche un INNER JOIN). Quindi il comportamento di QGis non è un LEFT OUTER JOIN ma qualcosa di diverso ancora: un select top 1 order by id desc per ogni record.
    Saluti

    Piace a 1 persona

    1. Ciao e grazie per il messaggio.
      In QGIS funziona come descritto nel blog, cioè la tabella di SX non cambierà mai, cioè il numero di righe è quello e non cambierà mai mettendola in JOIN. Inoltre, quando si parla di JOIN le due tabelle sono sempre in relazione 1:1.

      "Mi piace"

      1. Appunto. Ma questo comportamento non è un left outer join “puro” (lo dico da programmatore e analista database): è una cosa diversa, in cui oltre al left outer join è eseguito anche un filtro per non moltiplicare le righe.
        Ho trovato questo Suo articolo proprio perchè ho bisogno di questo comportamento (relazioni uno-a-molti) che invece normalmente QGis non fa (conosco bene i database ma molto poco QQis).
        Da da quello che sto sperimentando questa mattina, il metodo è invece usare un virtual layer e lì, nella query, inserire la relazione manualmente e ottenere un vero left outer join.

        Piace a 1 persona

      2. Ripeto, in QGIS si fa la distinzione tra semplice JOIN (1:1) e RELAZIONI (n:m). quindi quando sai che le due tabelle sono in rapporto 1:1 fai una semplice join tabellare, in altri casi devi definire una relazione di progetto.
        I virtual layer si basano su SQL.

        "Mi piace"

  2. Ti ringrazio, ho capito. Ho provato dapprima con i virtual layer: sembra che QGis non ce la faccia. Si tratta di 8000 poligoni (particelle di terreno di un comune), che con il left outer join con la tabella Excel restano più o meno lo stesso numero (alcune vanno a NULL, altre si duplicano perchè ho più dati per lo stesso poligono). Il programma impiega 5 minuti solo per aggiungere il layer al progetto e poi, nel visualizzarlo, va lentissimo (sembra faccia una riga dello schermo alla volta!). Sto usando un portatile core i7, 8GB Ram e QGis 3.10.. Allora ho provato con le relazioni, definite a livello di progetto. Qualcosa va ma è come se i dati restassero separati… non si possono applicare etichette in base ai campi della tabella collegata, nè gli stili…. Sbaglio approccio ? Grazie

    Piace a 1 persona

    1. Ciao,
      i virtual layer non sono sono molto veloci, potresti usare gli indici ma meglio percorrere altra strada.
      Per quanto riguarda la relazione di progetto, puoi benissimo etichettare o tematizzare, ma occorre esperienza, quello che vuoi fare non è di certo una cosa base.
      Su questo argomento ho scritto altri blog, cercali e vedi come etichettare e tematizzare usando i layer in relazione.
      ciao

      "Mi piace"

  3. Salve a tutti, in particolare a Totò. Ho letto l’articolo, allacciandomi al tema io avrei la necessità di realizzare un JOIN in qgis utilizzando però due campi e non soltanto uno. Se magari Totò potesse illuminarmi in proposito ….

    Piace a 1 persona

Lascia un commento

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.