Выделите дубликаты между двумя наборами результатов - PullRequest
0 голосов
/ 19 августа 2010

У меня проблемы с запросом, который я пытаюсь сделать. Я пытаюсь выбрать значения, подходящие для наборов результатов.

В настоящее время я имею дело с двумя запросами:

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) То же, что и выше, кроме второй последней строки, в которой

AND fnppp.id = 1715

Так что теперь первый запрос возвращает 1536 записей, а второй возвращает 2067. Однако есть записи (люди), которые появляются в обоих запросах. То, что я хочу сделать, это выделить их. (По сути, я хочу сделать пересечение, поэтому я посмотрю на это)

До сих пор я пытался сделать следующее:

- Я добавил следующее к запросу A:

AND pi.person_id NOT IN (SELECT    /*+ RULE */ pi.person_id FROM ... )
где запрос в скобках - это запрос B (кроме первой строки). Это возвращает около 10 строк (я не уверен, что это точно).

-Я затем выполнил тот же запрос, кроме NOT IN. Это дает мне результат около 200 (не уверен, что это точно).

Теперь эти два числа явно не складываются в 1536, что, я думаю, должно произойти? Очевидно, что один или оба они не правы.

Может кто-нибудь сказать, что я делаю не так? Спасибо за вашу помощь.

1 Ответ

1 голос
/ 19 августа 2010

Если вы действительно ищете записи, совпадающие между двумя наборами результатов, ознакомьтесь с информацией о команде SQL INTERSECT .

Хотя, глядя на ваш запрос, я не уверенэто то, что ты хочешь.Если одна запись имеет fnppp.id = 1169, то как эта же запись может иметь fnppp.id = 1715?

Возможно, вы ищете что-то, что больше похоже на SQL UNION ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...