在两个结果集之间单独输出重复项

时间:2010-08-19 17:43:57

标签: sql oracle

我正在尝试执行查询时遇到问题。我正在尝试选择结果集中的值。

我目前正在处理两个问题:

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 个答案:

答案 0 :(得分:1)

如果您真的在寻找两个结果集之间匹配的记录,请查看有关SQL INTERSECT命令的信息。

但是,查看您的查询,我不确定这是您想要的。如果一条记录有fnppp.id = 1169,那么同一条记录如何有fnppp.id = 1715

您是否正在寻找更像SQL UNION的内容?