[英]Querying query results
例如,如果我有一個查詢
SELECT * FROM MY_TABLE WHERE FIRSTNAME = 'HENRY';
多數民眾贊成返回說20亨利結果是相同的。
有沒有一種方法可以查詢原始查詢的結果以僅返回非重復項。
這是一個簡單的示例,但是基本上我有一個查詢,在該查詢中嘗試對大型數據集執行SELECT DISTINCT。 如果我不指定DISTINCT,則會得到一些相對較小且快速的重復數據。 我可以應用SQL中的任何邏輯,然后對這些結果執行SELECT DISTINCT。 本質上是分解查詢以減少響應時間? 假設所有有價值的東西都被索引了。
謝謝
要返回一組記錄中的第一個,您可以執行以下操作:
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 --, ...
請注意,對於數據庫來說,將數據集划分為具有重復記錄的記錄和不具有重復記錄的記錄通常比執行實際的區分操作效率更高,除非發生重復的列數遠遠少於執行重復操作的列數。總列數。
在某些非常寬的表的情況下,其中重復僅存在於子集的列和一小部分的行上,這樣做可能會更有效:
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)
除非它避免了效率非常低的事情(例如,很大的種類溢出到磁盤上),否則通常不值得這樣做。
編輯:修改查詢
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.