2015-10-19 44 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

相關問題