Comment mettez-vous littéraux dans le résultat d'un jeu de résultats SQL basé sur quelle table a été rejointe pour créer la ligne?

StackOverflow https://stackoverflow.com/questions/1751647

  •  20-09-2019
  •  | 
  •  

Question

I ai 3 tables, une qui représente une "super-type", avec une colonne d'ID. Deux autres tables sont chacun des sous-types, avec une colonne d'identification qui est une clé étrangère à la table supertype, en plus d'une colonne spécifique sous-type.

Je veux une requête qui renvoie toutes les données, ainsi qu'une colonne que je peux utiliser comme un discriminateur qui me dit quelle table la ligne vient.

Ainsi, par exemple, comment puis-je modifier ceci:

SELECT * from SUPER S 
left outer join SUB_1 S1 on S.ID = S1.ID
left outer join SUB_2 S2 on S.ID = S2.ID

Ce qui me renvoie ceci:

ID    SUB_COL_1  SUB_COL_2
====  =========  =========
0001  value x    NULL
0002  value y    NULL
0003  NULL       value z

Dans quelque chose qui va ajouter une colonne discriminante avec des valeurs littérales codées en dur, comme ceci:

ID    DISCRIMINATOR  SUB_COL_1  SUB_COL_2
====  =============  =========  =========
0001  SUBTYPE_1      value x    NULL
0002  SUBTYPE_1      value y    NULL
0003  SUBTYPE_2      NULL       value z

Je ne suis pas autorisé à modifier le modèle de données de quelque façon. Je ne peux pas faire aussi une post-traitement en testant pour NULLS programme après le fait. Je dois travailler avec les tables en l'état, et de produire l'ensemble exact de résultat ci-dessus. J'utilise Oracle 11g, si cela fait une différence dans la réponse.

Était-ce utile?

La solution

Vous pouvez ajouter:

CASE IF S1.ID IS NULL THEN 'SUBTYPE_1' ELSE 'SUBTYPE_2' END AS DISCRIMINATOR, 

au début de votre clause SELECT.

Autres conseils

est peut-être ce que vous cherchez ... vous pourriez avoir à faire quelques changements pour le faire fonctionner sur Oracle.

SELECT case coalesce(SUB_COL_1,'') when '' then 'SUBTYPE_2'  else 'SUBTYPE_1' end,  * from SUPER S 
left outer join SUB_1 S1 on S.ID = S1.ID
left outer join SUB_2 S2 on S.ID = S2.ID

Je fais habituellement cela avec une requête UNION

Select S.ID, SUBTYPE_1 as DISCRIMINATOR, S1field1 as SUB_COL_1, null as SUB_COL_2  
from SUPER S 
join SUB_1 S1 on S.ID = S1.ID
union all 
Select S.ID, SUBTYPE_2 as DISCRIMINATOR, null as SUB_COL_1, S2.field1 as SUB_COL_2  
from SUPER S 
join SUB_2 S2 on S.ID = S2.ID

Je serais probablement ajouter l'identifiant aux données de chaque table dans une sous-requête avant de le joindre.

SELECT * from 
    (select *, 'SUPER' as DISCRIMINATOR from SUPER ) S 
left outer join 
    (select *, 'SUBTYPE1' as DISCRIMINATOR from SUB_1 ) S1 
    on S.ID = S1.ID
left outer join 
    (select *, 'SUBTYPE1' as DISCRIMINATOR from SUB_2 ) S2 
    on S.ID = S2.ID
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top