查询查询结果

时间:2013-10-24 10:41:21

标签: sql

如果我有查询例如

SELECT * FROM MY_TABLE WHERE FIRSTNAME = 'HENRY';

那回事说亨利的20个结果是相同的。

有没有办法再查询原始查询的结果,只返回非重复项。

这是一个简单的例子,但基本上我有一个查询,我试图在大型数据集上执行SELECT DISTINCT。如果我没有指定DISTINCT,我会得到一些相对较小且快速返回的重复数据。 SQL中是否有任何逻辑可以应用于然后对这些结果执行SELECT DISTINCT。基本上打破查询以减少响应时间?假设有价值的一切都被编入索引。

由于

2 个答案:

答案 0 :(得分:0)

要返回一组记录中的第一个,您可以执行以下操作:

select *
from
(
    SELECT *, row_number() over (partition by firstname order by id) r
    FROM MY_TABLE 
    --WHERE FIRSTNAME = 'HENRY'
) x
where x.r = 1

如果记录是完全重复的,那么你并不担心第一个,因为它们完全相同,所以你只需要不同的记录:

SELECT distinct *
FROM MY_TABLE 
WHERE FIRSTNAME = 'HENRY'

或查看有多少重复:

SELECT *, count(*)-1 NoOfDuplicates
FROM MY_TABLE 
WHERE FIRSTNAME = 'HENRY'
group by firstname, lastname --, ...

答案 1 :(得分:0)

请注意,数据库将数据集划分为具有重复的记录和不具有重复记录的记录通常不会比执行实际的不同更有效,除非发生重复的列数非常多小于总列数。

在某些非常宽的表中,只有列的子集和一小部分行存在重复,可能更有效地执行以下操作:

select *
from   my_table t1
where  not exists (
         select null
         from   my_table t2
         where  t2.duplication_column = t1.duplication_column and
                t2.rowid              != t1.rowid)
union all
select distinct *
from   my_table t1
where  exists (
         select null
         from   my_table t2
         where  t2.duplication_column = t1.duplication_column and
                t2.rowid              != t1.rowid)

这通常不值得做,除非它避免了非常低效的事情,例如一个非常大的类型溢出到磁盘。

编辑:修改了查询