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.
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' ... –
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') –
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é? –