符合GROUP BY和HAVING条款的第一条记录

时间:2016-03-14 13:39:28

标签: sql oracle

我有一个SQL Server查询,它使用链接服务器连接从Oracle 8i服务器获取数据。我的问题完全在于Oracle SQL。

有一个StyleSizes表。一种样式可以具有与其相关联的一种或多种尺寸。我需要找到任何一个具有多个Size_CD的Style_CD。这可以通过GROUP BY和HAVING来实现。但我只需要一种这样的风格。表的数量是如此之大,我不能等到查询执行完成 - 所以我只需要一种风格。

如何在Oracle中应用GROUP BY和HAVING子句后快速获取一条记录?

SELECT STYLE_CD
FROM OPENQUERY(LinkedORAServer,  
   'SELECT STYLE_CD
   FROM DA.StyleSize M  
   GROUP BY STYLE_CD
   HAVING COUNT(SIZE_CD) > 1
    ')  

进一步阅读

  1. Ask Tom - On ROWNUM and Limiting Results
  2. Limit - Comparison of different SQL implementations
  3. How do I limit the number of rows returned by an Oracle query after ordering?
  4. Row Limiting Clause for Top-N Queries in Oracle Database 12c Release 1 (12.1)
  5. SQL Server - Pagination with OFFSET / FETCH : A better way

4 个答案:

答案 0 :(得分:2)

你应该使用类似于MySQL限制和SQL-SERVER顶部的ROWNUM:

SELECT STYLE_CD
FROM OPENQUERY(LinkedORAServer,  
   'SELECT STYLE_CD FROM(SELECT STYLE_CD
                         FROM DA.StyleSize M  
                         GROUP BY STYLE_CD
                         HAVING COUNT(SIZE_CD) > 1)
    WHERE rownum = 1
    ') 

答案 1 :(得分:2)

SELECT * FROM (SELECT SIZE_CD, COUNT(STYLE_CD) OVER (PARTITION BY STYLE_CD) CNT FROM STYLESIZE) WHERE CNT > 1

答案 2 :(得分:2)

如果您想要一种具有多种尺寸的样式,请快速使用exists

select m.*
from da.stylesize m
where exists (select 1 from da.stylesize m2 where m2.style_cd = m.style_cd and m2.size_cd <> m.size_cd) and
      rownum = 1;

然后,您要确保在da.stylesize(style_cd, size_cd)上有索引。

使用此查询,您甚至不需要进行聚合,这应该是一个很大的节省。

答案 3 :(得分:1)

SELECT STYLE_CD
FROM OPENQUERY(LinkedORAServer,  
   'select VAL from (
select VAL,COUNT(*) from SANDEEP24FEB2016_2 group by VAL having COUNT(*)>1 
) where rownum=1
    ') ;