2017-06-06 7 views
0

J'essaie de créer une vue pour l'une des tables que j'ai. Pour l'une des colonnes de la vue, je suis en train de lire la valeur des tableaux que j'ai:Lecture d'une valeur de colonne à partir de plusieurs tables en fonction de certaines conditions - postgreSQL

Tableau A:

id b_id c_id d_id 
1  1 
2   1 
3      1 

Tableau B:

id code 
1  64 

Tableau C:

id code 
1  98 

Tableau D:

id  code 
1  26 

Dans les tableaux ci-dessus, A est ma table principale qui a deux références de clé étrangère aux tables B et C (b_id et c_id) respectivement. Et pour chaque ligne du tableau A, une seule des deux références (b_id ou c_id) sera remplie.

Ma tâche est de créer une vue pour la table A, dire V_A, qui aura les colonnes suivantes:

Voir V_A:

code  code_table 
64   B 
98   C 
26   D 

Dans la vue ci-dessus, je dois d'abord vérifier pour chaque ligne de la table A, laquelle des références de clé étrangère sont remplies, sur la base de ce que je dois lire la colonne 'code' et la colonne 'code_table' aura le nom de la table que je remplis la colonne 'code'.

J'ai été capable de créer des vues simples mais c'est un peu difficile pour moi. Je vérifiais si je peux utiliser cas ... quand pour le même mais après un point qui est devenu un peu compliqué aussi. Je peux également lire le nom de table dans postgres du tableau information_schema. J'ai donc des bribes de solution mais je ne comprends pas comment tout mettre ensemble.

Quelqu'un peut-il me diriger dans la bonne direction?

Merci!

Répondre

1

Bien sûr, il ne fonctionnera que si vous disposez d'un seul tableau rempli ou l'autre - il ne résout pas les conflits lorsque les deux contes ont des clés correspondant à:

t=# create view _a as select coalesce(b.code,c.code,d.code) code, case when b.id is not null then 'B' when c.id is not null then 'C' when d.id is not null then 'D' end from a 
left outer join b on b.id = b_id 
left outer join c on c.id = c_id 
left outer join d on d.id = d_id; 
CREATE VIEW 
t=# select * from _a; 
code | case 
------+------ 
    26 | D 
    98 | C 
    64 | B 
(3 rows) 
+0

Merci pour la réponse, si j'ai plus deux tables à lire. Par exemple, avez 2 références de clés étrangères supplémentaires pour 2 tables de plus? –

+0

vous supprimez la vue et en créer une autre - pour plus de table à rejoindre –

+0

Mais votre réponse ne fonctionnera que si j'ai deux deux tables enfant. Avez-édité la question. –