2010-08-19 9 views
0

J'ai des problèmes avec une requête que j'essaie de faire. J'essaie de sélectionner les valeurs qui apparaissent dans les ensembles de résultats.Exceptions de doublons entre deux ensembles de résultats

Je traite actuellement deux requêtes:

A)

SELECT  /*+ RULE */ pi.compressed_name, pi.phn, to_char(pi.date_of_birth , 'YYYY/MM/DD') as date_of_birth, gen.description as gender 
     , 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.group_type gt, 
    medcrtr.program_eligibility pe, 
    person_index pi, 
    gender_type gen 
WHERE gm.entity_type_id = 1 --:P_PERSON_ENTITY_TYPE_ID 
    AND gen.id = pi.gender_code 
    AND gt.id = gm.group_id 
    AND gt.category_id = 1 --icgroupmemebrcategory :P_GROUP_CATEGORY_ID 
    AND fn.source_id = group_id 
    AND fn.entity_type_id = 3 --icGOM:P_ENTITY_TYPE_ID 
    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)

B) Comme ci-dessus autre que dernière ligne, dans laquelle

AND fnppp.id = 1715

Alors maintenant, le premier La requête renvoie 1536 enregistrements et la seconde renvoie 2067. Il existe cependant des enregistrements (personnes) qui apparaissent dans les deux requêtes. Ce que je veux faire, c'est les distinguer. (Essentiellement, je veux faire une intersection, donc je "vais regarder dans cela)

Jusqu'à présent, j'ai essayé de faire ce qui suit:

-J'ai ajouté ce qui suit pour interroger A:

AND pi.person_id NOT IN (SELECT /*+ RULE */ pi.person_id FROM ...)
où le requête à l'intérieur des parenthèses est la requête B (autres que pour la première ligne). Cela renvoie environ 10 lignes (je ne suis pas sûr que ce soit exact).

-I puis a couru la même requête, sauf avec NOT IN. Cela me donne un résultat d'environ 200 (pas sûr si cela est exact).

maintenant, ces deux nombres évidemment ne pas ajouter jusqu'à 1536, ce qui je pense devrait arriver? Donc, évidemment, l'un ou l'autre d'entre eux a tort.

Quelqu'un peut-il dire ce que je fais mal? Merci de votre aide.

+0

On dirait que vous avez des données hiérarchiques - se référant à toutes les références 'medcrtr.forest_node' - mais vous n'utilisez pas la syntaxe hiérarchique Oracle' CONNECT BY' ... –

+0

Pourriez-vous préciser ce que vous voulez dire par "les singulariser"? Voulez-vous uniquement voir les lignes qui correspondent aux valeurs 'fnppp.id' (utilisez' INTERSECT') ou uniquement les lignes uniques (utilisez 'UNION') –

+0

Merci pour la réponse. INTERSECT est ce que j'aurais dû utiliser depuis le début. J'essaye d'implémenter la syntaxe de CONNECT BY cependant, mais je ne suis pas sûr comment commencer, avez-vous des conseils sur par où commencer? Aussi, quels sont les avantages par rapport à la façon dont mes questions sont écrites, autres que la propreté? –

Répondre

1

Si vous cherchez vraiment pour les enregistrements qui correspondent entre deux ensembles de résultats, consultez les informations sur la commande SQL INTERSECT.

En regardant votre requête, cependant, je ne suis pas sûr que ce que vous voulez. Si un enregistrement a fnppp.id = 1169, alors comment le même enregistrement peut-il avoir fnppp.id = 1715?

Vous cherchez peut-être pour quelque chose qui est plus comme SQL UNION?

+0

Merci, je ne sais pas comment j'ai oublié INTERSECT, c'est ce dont j'avais besoin. –

Questions connexes