2016-12-16 77 views
0

我面临的麻烦试图代码下面的查询DISTINCT:ROWNUM和在Oracle

SELECT id, 
     contractnumber, 
     partyid, 
     entity, 
     product, 
     fecha 
FROM (
    SELECT DISTINCT (contractdet.id), 
     contractdet.contractnumber, 
     contractdet.partyid, 
     contractdet.entity, 
     contractdet.product, 
     contractdet.fecha, 
     ROWNUM AS rnumber 
    FROM contractdet 
    INNER JOIN contractcust ON contractcust.contractdet_id = contractdet.id 
    INNER JOIN customerdet ON customerdet.partyid = contractdet.partyid 
    WHERE TO_CHAR(contractdet.fecha, 'YYYYMM') <= TO_CHAR(ADD_MONTHS(TO_DATE(20160828, 'YYYYMMDD'), -3), 'YYYYMM') 
    AND contractdet.product = 'TC' 
    ORDER BY contractdet.id ASC 
) 
WHERE rnumber BETWEEN ? AND ? 
ORDER BY id 

我用它在一段java代码,以网页的过程中,重复的查询和检索1000个结果每一次。我遇到的主要问题是,DISTINCT命令仅适用于我处于的时间间隔,而不适用于整个结果集,因此当我混合所有查询的输出时,它会检索重复的行。

+0

努力设置您的查询格式。 –

+6

'DISTINCT'是***不是***功能。它始终适用于查询中的所有**列。 –

+2

另外:'TO_DATE(20160828,..)'是错误的。 'to_date()'需要一个字符串('varchar')而不是一个数字,你不需要'to_date()'。表达式也可以简化为:ADD_MONTHS(DATE'2016-08-28',-3)' –

回答

0

你可以在Java的SQL中使用CTE吗?

下面是一个例子:

with distinctRecords as (
    select distinct myCol, rownum rnum 
    from myTable 
    order by myCol 
) 
select * 
from distinctRecords 
where rnum between ? and ?; 
+0

也就是说,实际上,OP在使用内联视图时正在做什么。它仍然是一个子查询(并且由于rownum的存在,不能被引用),无论你是在with子句还是在from子句中声明子查询。 – Boneist

0

你可以做这样的事情:

with t as (
     <your subquery here without the `distinct`> 
    ) 
select t.* 
from (select t.*, 
      row_number() over (partition by id order by id) as seqnum 
     from t 
    ) t 
where seqnum = 1; 

这将选择每个id一个任意行。您可以通过更改子查询中的order by来控制选择哪一行(如最早或最新)。