2015-10-19 40 views
1

PFB我的SQL查询,而不DISTINCT或独特的关键字,如何在不使用DISTINCT和UNIQUE关键字的情况下获取唯一记录?

SELECT CLAIM.CLAIM_ID, 
CLAIM.ASSESSMENT_UNIT_ID, 
HOUSEHOLD_MEMBER.ASSESSMENT_UNIT_MEM_ID, 
PERSON.PERSON_ID 
FROM CLAIM, 
    AWARD, 
    AWARD_MEMBER, 
    HOUSEHOLD_MEMBER, 
    PERSON, 
    CONDITIONALITY_GROUP 
WHERE CLAIM.CLAIM_ID    = AWARD.CLAIM_ID 
AND AWARD.AWARD_ID    = AWARD_MEMBER.AWARD_ID 
AND AWARD_MEMBER.HH_MEMBER_ID  = HOUSEHOLD_MEMBER.HH_MEMBER_ID 
AND HOUSEHOLD_MEMBER.PERSON_ID = PERSON.PERSON_ID 
AND HOUSEHOLD_MEMBER.HH_MEMBER_ID = CONDITIONALITY_GROUP.HH_MEMBER_ID; 

以下是上面的查询

CLAIM_ID ASSESSMENT_UNIT_ID ASSESSMENT_UNIT_MEM_ID PERSON_ID 
5000000002 5000000002   1000004    1000004 
5000000002 5000000002   1000004    1000004 
5000000002 5000000002   1000003    1000003 
5000000002 5000000002   1000003    1000003 

具有独特的或不同的问题的帮助下解决的结果,但它影响的性能查询如此善意让我们知道,如何以另一种方式?

欣赏为您的帮助提前:)

+0

为什么不使用'GROUP BY CLAIM.CLAIM_ID,CLAIM.ASSESSMENT_UNIT_ID,HOUSEHOLD_MEMBER.ASSESSMENT_UNIT_MEM_ID,PERSON.PERSON_ID'? – Stawros

+1

对于“DISTINCT”或“GROUP BY”,您经常需要在内部执行“ORDER BY”,这是一项昂贵的操作。你为什么不解决为什么你的查询给你“重复” - 它看起来并不像你使用'CONDITIONALITY_GROUP'。如果你使用'EXISTS'来代替,并且该表导致重复,它将解决你的问题。 –

+1

@Stawros:截然不同,分组给我同样的表现。 –

回答

0

做这样的事情(假设所有的数据类型是整数)。

这将首先将空行添加到您的数据。但是当你在做union时,它会删除重复项。然后通过执行空行的minus来删除重复项。

SELECT CLAIM.CLAIM_ID, 
CLAIM.ASSESSMENT_UNIT_ID, 
HOUSEHOLD_MEMBER.ASSESSMENT_UNIT_MEM_ID, 
PERSON.PERSON_ID 
FROM CLAIM, 
AWARD, 
AWARD_MEMBER, 
HOUSEHOLD_MEMBER, 
PERSON, 
CONDITIONALITY_GROUP 
WHERE CLAIM.CLAIM_ID    = AWARD.CLAIM_ID 
AND AWARD.AWARD_ID    = AWARD_MEMBER.AWARD_ID 
AND AWARD_MEMBER.HH_MEMBER_ID  = HOUSEHOLD_MEMBER.HH_MEMBER_ID 
AND HOUSEHOLD_MEMBER.PERSON_ID = PERSON.PERSON_ID 
AND HOUSEHOLD_MEMBER.HH_MEMBER_ID = CONDITIONALITY_GROUP.HH_MEMBER_ID 

union 
select null,null,null,null from dual 

minus 

select null,null,null,null from dual 

我试着用这个查询,它没有给出任何重复。

(select 1,1,1,1 from dual union all 
select 1,1,1,1 from dual union all 
select 1,1,2,2 from dual union all 
select 1,1,2,2 from dual) 
union 
select null,null,null,null from dual 
minus 
select null,null,null,null from dual 

输出

1 1 1 1 
1 1 2 2  
+0

嗨,感谢您的努力,但在上面的帮助..查询成本增加...我正在寻找解决方案,我可以减少查询的成本。 –

0

为了提高性能上都包含在where子句中的列创建索引。例如,要创建的索求表使用CLAIM_ID列的索引:

create index idx_claimid_claim on CLAIM(CLAIM_ID) 

您可能需要根据您在每一列有数据来创建位图索引或B树索引。

+0

索赔ID是主键,索引已经存在于该列中。 –

+0

我刚刚举了一个例子..你可以添加其他索引来提高性能 – Raj

相关问题