2010-08-19 8 views
1

Ceci est une émanation de la question suivante: Single out duplicates between two result setsOracle CONNECT BY Syntaxe

Comme par un commentaire en ce que des questions, je suis en train de mettre en œuvre ma requête en utilisant la syntaxe spéciale « CONNECT BY » Oracle. J'ai du mal à trouver des informations (claires) sur la façon d'implémenter la syntaxe dans mon cas.

Ma requête:

SELECT pi.compressed_name, pi.phn, to_char(pi.date_of_birth , 'YYYY/MM/DD') as date_of_birth, 
    to_char(pe.started_on , 'YYYY/MM/DD') as medicare_eligibility_start, 
    to_char(pe.ended_on , 'YYYY/MM/DD') as medicare_eligibility_end 
FROM medcrtr.forest_node fnpppp, 
    medcrtr.forest_node fnppp, 
    medcrtr.forest_node fnpp, 
    medcrtr.forest_node fnp, 
    medcrtr.forest_node fn, 
    medcrtr.group_member gm, 
    medcrtr.program_eligibility pe, 
    person_index pi 
WHERE gm.entity_type_id = 1 
    AND fn.source_id = gm.group_id 
    AND fn.entity_type_id = 3 
    AND fnp.id = fn.parent_id 
    AND fnpp.id = fnp.parent_id 
    AND fnppp.id = fnpp.parent_id 
    AND fnpppp.id = fnppp.parent_id 
    AND pe.person_id = gm.source_id 
    AND pe.sub_program_id = fnpp.parent_id 
    AND pi.person_id = gm.source_id 
    AND fnppp.id = 1169 
    AND (gm.ended_on >= SYSDATE OR gm.ended_on IS NULL)

Quelqu'un peut-il me diriger dans la bonne direction pour l'obtenir converti en syntaxe différente?

Je pense quelque chose le long des lignes de:

SELECT pi.compressed_name, pi.phn, to_char(pi.date_of_birth , 'YYYY/MM/DD') as date_of_birth, 
    to_char(pe.started_on , 'YYYY/MM/DD') as medicare_eligibility_start, 
    to_char(pe.ended_on , 'YYYY/MM/DD') as medicare_eligibility_end 
FROM medcrtr.forest_node fn, 
    group_member gm, 
    program_eligibility pe, 
    person_index pi 
WHERE gm.entity_type_id = 1 
    AND fn.source_id = gm.group_id 
    AND fn.entity_type_id = 3 
    AND pe.person_id = gm.source_id 
    --AND pe.sub_program_id = fnpp.parent_id ??? 
    AND pi.person_id = gm.source_id 
    --AND fnppp.id = 1169 ??? 
    AND (gm.ended_on >= SYSDATE OR gm.ended_on IS NULL) 
CONNECT BY PRIOR fn.id=fn.parent_id

Ce ne fonctionne pas de toute évidence, et je ne sais pas comment intégrer la fonctionnalité du FNPP ... l 'aide yet.Any ?

+0

Désolé, qu'entendez-vous par « couper ce retour à la .. "? J'obtiendrai des données –

+1

Assurez-vous que la requête hiérarchique fonctionne d'abord dans le contexte de la table 'forest_node', puis commencez à virer sur JOINs. –

Répondre

1

Je ne suis pas sûr, mais je pense que vous manquez la clause start with:

SELECT pi.compressed_name, pi.phn, to_char(pi.date_of_birth , 'YYYY/MM/DD') as date_of_birth, 
    to_char(pe.started_on , 'YYYY/MM/DD') as medicare_eligibility_start, 
    to_char(pe.ended_on , 'YYYY/MM/DD') as medicare_eligibility_end 
FROM medcrtr.forest_node fn, 
    group_member gm, 
    program_eligibility pe, 
    person_index pi 
WHERE gm.entity_type_id = 1 
    AND fn.source_id = gm.group_id 
    AND fn.entity_type_id = 3 
    AND pe.person_id = gm.source_id 
    AND pi.person_id = gm.source_id 
    AND (gm.ended_on >= SYSDATE OR gm.ended_on IS NULL) 
start with fn.id = 1169 /*THis is where the recursion will start */ 
CONNECT BY PRIOR prior fn.id=fn.parent_id /*specify you want the current node's parent id to match the previous node's id*/ 

Une bonne référence: http://www.adp-gmbh.ch/ora/sql/connect_by.html

Questions connexes