Ho 3 tabelle, con Tabella B & C tabella di riferimento A tramite chiave esterna. Voglio scrivere una query in PostgreSQL per ottenere tutti gli ID di A e anche le loro occorrenze totali da B & C.Calcolo del numero di chiavi esterne da più tabelle
a | b | c
-----------------------------------
id | txt | id | a_id | id | a_id
---+---- | ---+----- | ---+------
1 | a | 1 | 1 | 1 | 3
2 | b | 2 | 1 | 2 | 4
3 | c | 3 | 3 | 3 | 4
4 | d | 4 | 4 | 4 | 4
uscita desiderato (solo l'id da A conteggio totale & in B & C):
id | Count
---+-------
1 | 2 -- twice in B
2 | 0 -- occurs nowhere
3 | 2 -- once in B & once in C
4 | 4 -- once in B & thrice in C
SQL finora SQL Fiddle:
SELECT a_id, COUNT(a_id)
FROM
(SELECT a_id FROM b
UNION ALL
SELECT a_id FROM c
) AS union_table
GROUP BY a_id
La query che ho scritto recupera da B & C e conta le occorrenze. Ma se la chiave non si verifica in B o C, non viene visualizzata nell'output (ad es. Id = 2 in output). Come posso iniziare la mia selezione dalla tabella A & join/unione B & C per ottenere il risultato desiderato
Perché dici che la tua seconda opzione è "probabilmente più lenta"? Ha meno JOIN, non dovrebbe essere più veloce? – click
@click Non sono un esperto di PostgreSQL (lontano da esso), ma probabilmente utilizzando una funzione di aggregazione come 'GROUP BY' sarà effettivamente più lento. Ma pensandoci meglio, non capisco perché la prima domanda di Erwin dovrebbe essere più veloce della mia risposta (credo che entrambi avrebbero piani di esecuzione simili in database come Oracle e SQL Server), ma * suppongo * che lui sappia cosa sta parlando. – rsenna
@click: il numero di join è solo uno dei tanti fattori. Tutto dipende dalle cardinalità e dalla distribuzione dei dati (tra gli altri). Ecco perché parlo di casi e probabilità tipici. Devi verificare con il tuo scenario * attuale * per sapere con certezza. La prima query tipicamente colpisce un punto debole tra semplicità ed efficacia. –