1. ホーム
  2. sql

[解決済み] Oracle SELECT TOP 10 レコード [重複]の場合

2022-03-01 04:24:36

質問

Oracle の SQL 文で大きな問題があります。他のselect文からリストにないSTORAGE_DBで並べたTOP10レコードを選択したいのですが。

これは、すべてのレコードに対して正常に動作します。

SELECT DISTINCT 
  APP_ID, 
  NAME, 
  STORAGE_GB, 
  HISTORY_CREATED, 
  TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') AS HISTORY_DATE  
  FROM HISTORY WHERE 
      STORAGE_GB IS NOT NULL AND 
        APP_ID NOT IN (SELECT APP_ID
                       FROM HISTORY
                        WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') = '06.02.2009') 

しかし

AND ROWNUM <= 10
ORDER BY STORAGE_GB DESC

ランダムレコードのようなものが表示されます。注文の前にリミットがかかっているからだと思います。

どなたか良い解決策をご存知でしょうか?他の問題:このクエリは非常に遅いです(10K +レコード)。

解決方法は?

以下のように、現在のクエリをサブクエリに入れる必要があります。

SELECT * FROM (
  SELECT DISTINCT 
  APP_ID, 
  NAME, 
  STORAGE_GB, 
  HISTORY_CREATED, 
  TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') AS HISTORY_DATE  
  FROM HISTORY WHERE 
    STORAGE_GB IS NOT NULL AND 
      APP_ID NOT IN (SELECT APP_ID FROM HISTORY WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') ='06.02.2009')
  ORDER BY STORAGE_GB DESC )
WHERE ROWNUM <= 10

オラクルが適用 ローヌム を返した後、その結果に
結果が返された後にフィルタリングする必要があるので、サブクエリが必要です。また RANK() 関数で上位からN個の結果を得ることができます。
パフォーマンスを上げるには NOT EXISTS の代わりに NOT IN . 参照 これ をご覧ください。