2010-07-28 83 views
0

如果需要更多信息來回答此問題,請確實添加註釋。使用笛卡爾積聚尋呼

我們有一個查詢返回笛卡爾積。由於有很多結果,可能會有大量的物體被水化。我們希望在數據庫端進行簡單的分頁,因此速度很快,所以它只從第n行的第n個頁面開始n次結果,其中n表示爲100.

我們遇到的麻煩是正在對查詢完成distinct以便僅返回必要的行。但是,這最終會過濾結果,所以你得到的數量少於100.

因此,即使我們有頁碼,我們也不知道從哪裏開始或停止,而不用查詢來查看起始點(即我們不能使用rownum),並有可能循環,直到我們得到100個結果,你就明白了。這很混亂。

如果需要,我們可以直接做SQL,但重構表格不是一個選項。

無論哪種方式,我無法想象我們是第一次遇到這種情況,所以我想知道是否有辦法做到這一點。

在此先感謝!

編輯: @ nicolas78發表了評論,準確地描述了情況。

+0

我對你在做什麼有一個模糊的想法。基本上你不知道如何處理結果集的第101行,因爲它基於兩個參數,並且大量的組合會被扔掉?如果是這樣,我不知道如何預測這一點(我認爲問題不是一次或一次分頁,而是跳到第5頁那樣你不知道如何得到它們的問題,對不對?)。這並沒有那麼有用 - 只是試圖澄清條件。 – Nicolas78 2010-07-28 14:59:52

+0

是的,這正是問題所在。即使我們要求100個結果,我們所能得到的結果也只有67個。我們不知道請求頁面n時開始的行是什麼 – 2010-07-28 15:24:17

回答

2

您需要將DISTINCT進一步推入查詢中,以便在應用分頁之前完成。例如:

select deptno from 
    (select deptno, rownum as rn from 
     (select DISTINCT deptno 
     from emp 
     order by deptno 
    ) 
    where rownum < :pagenum*100 
) 
where rn > (:pagenum-1)*100;