1

例如,如果我有一个查询

SELECT * FROM MY_TABLE WHERE FIRSTNAME = 'HENRY';

那就是说亨利的二十个结果是相同的。

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

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

谢谢

4

2 回答 2

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 --, ...
于 2013-10-24T10:54:26.733 回答
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)

这通常是不值得做的,除非它避免了一些非常低效的事情,比如一个非常大的排序溢出到磁盘。

编辑:修改查询

于 2013-10-24T11:22:14.870 回答