2016-12-16 52 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來控制選擇哪一行(如最早或最新)。