4

テーブルの行数が多すぎるため、1000 のランダムな行を取得するための "ORDER BY dbms_random.value" 構造から SAMPLE 句に切り替えました。完了するのに 3 分ではなく、1 秒もかかりません。しかし、いくつかのテーブルでは、このエラーが発生します

ORA-01446: DISTINCT、GROUP BYなどのビューからROWIDを選択できません

私のクエリは次のようになります。

SELECT t1.columnA FROM 
(SELECT columnA FROM table1 sample(1) where rownum <= 1000)  t1 
JOIN table2 t2 
ON (t1.columnA = t2.columnA) 
WHERE t2.columnB IS NOT NULL

一部のテーブルでは正常に機能しますが、他のテーブルでは失敗します。グーグルをあきらめました。私の状況での回避策を教えてください。

4

1 に答える 1

3

私が予想したように、SAMPLE 句は他のすべてのソリューションよりも高速に動作します (ここでそれらのいくつかを確認できます) 。

私は一般的にOracle DB、特にOracle SQL Developerに慣れていないため、ビューを「テーブル」と誤って呼びました。解決策が明確であることがわかった後。

解決策: ビューを形成する SQL クエリを確認し、ビュー名をそのクエリに置き換える必要がありました。たとえば、私の table1 は実際にはビューであり、その名前をそのビューを形成する SELECT クエリに置き換えました。

SELECT t1.columnA FROM 
(SELECT columnA FROM (select distinct tt1.columnA,  tt2.columnC
  from table22 tt2, table11 tt1
 where tt2.columnC = tt1.columnA) sample(1) where rownum <= 1000)  t1 
JOIN table2 t2 
ON (t1.columnA = t2.columnA) 
WHERE t2.columnB IS NOT NULL

その後、テーブルを操作して SAMPLE を適用することができました! みんなありがとう、素晴らしいウェブサイト!=) PS: 私の英語と醜いコードfacepalm.jpgで申し訳ありません

于 2013-01-31T17:04:02.057 に答える