【问题标题】:How to fetch unique records without using DISTINCT and UNIQUE Keywords?如何在不使用 DISTINCT 和 UNIQUE 关键字的情况下获取唯一记录?
【发布时间】:2016-01-17 19:59:51
【问题描述】:

PFB 我的 SQL 查询没有 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

在独特或独特的帮助下,问题得到了解决,但它影响了查询的性能,所以请告诉我们,如何以另一种方式?

提前感谢您的帮助:)

【问题讨论】:

  • 为什么不使用GROUP BY CLAIM.CLAIM_ID,CLAIM.ASSESSMENT_UNIT_ID,HOUSEHOLD_MEMBER.ASSESSMENT_UNIT_MEM_ID,PERSON.PERSON_ID
  • DISTINCTGROUP BY 你经常需要在内部ORDER BY 这是一个昂贵的操作。你为什么不弄清楚为什么你的查询给你“重复” - 看起来你根本没有使用CONDITIONALITY_GROUP。如果您改用EXISTS,并且该表导致重复,它将解决您的问题。
  • @Stawros: distinct 和 group by 给了我同样的表现。
  • 为什么查询返回原样? 10 次中有 9 次,我打赌你缺少一个连接条件。但是,由于您尚未发布可重现的测试用例,因此除了您之外的任何人基本上都无法确定可能缺少哪个连接条件。
  • 请同时发布执行计划。并在问题标题中指定您只需要更快的不同行。你从 Utsav 得到的就是你在标题中所问的。

标签: sql oracle


【解决方案1】:

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

这将首先向您的数据添加空行。但是当你在做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    

【讨论】:

  • 您好,感谢您的努力,但在上述帮助下..查询成本增加...我正在寻找可以降低查询成本的解决方案。
【解决方案2】:

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

create index idx_claimid_claim on CLAIM(CLAIM_ID)

您可能希望根据每列中的数据创建位图索引或 b-tree 索引。

【讨论】:

  • 声称 id 是主键,并且该列上已经存在索引。
  • 我刚刚举了一个例子..你可以添加其他索引来提高性能
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多