1

選択クエリから一時テーブルにレコードを挿入しようとしていますが、一部のレコードが一時テーブルにありません。select ステートメントには複数の結合と結合があり、それらはすべて少し複雑なクエリです。簡単に言えば、スクリプトには 2 つの部分が含まれます。第 1 部は一時テーブルに挿入します。第 2 部は、複数の結合、インライン サブクエリ、ユニオン、およびクラスと条件によるグループを使用したクエリの選択です。

例えば。selectステートメントを単独で実行すると、たとえば=> 60000などのカウントが返されます一時テーブルに挿入した後、一時テーブルのカウントは約42000ですなぜ違いがあるのですか?

また、他にもいくつかの観察があります。最初の実行ではなく、2 回目の実行でのみ発生します。キャッシュに問題があることを願っています


セッション キャッシュをクリアすると (チェックポイント、shared_pool および buffer_cache をフラッシュ)、Re_Run で問題なく動作します。

しかし、この解決策が正しいかどうかはわかりません。また、キャッシュのクリアがバックグラウンドでどのように機能し、挿入に失敗したか。それが本当なら、何か間違った設定のセットアップだと思います。

コードは sql = "insert in to temptable select x,y,z,.... from xxx,abc,pqr..where...."; のようになります。(論理的だが現実的ではないのは、複数の結合、インラインサブクエリ、グループ化などを含む約 700 行で非常に複雑です。) stmt = conn.createStatement(); rCount= stmt.executeUpdate(sql); 実際の問題は rCount = xxxx = Count(temptable) < count(select x,y,z,.... from xxx,abc,pqr..where....) です なぜこの違いですか?一部のレコードが選択に取り込まれましたが、一時テーブルに挿入されませんでした

誰でも説明できますか?

あなたの努力と助けに前もって感謝します。

シヴァ。

4

2 に答える 2

0

解決策がありました。セッションキャッシュ(チェックポイント、フラッシュshared_pool、buffer_cache)をクリアすると、Re_Runで正常に機能します。 しかし、この解決策は大丈夫ではありませんか?また、キャッシュのクリアがバックグラウンドでどのように機能し、挿入に失敗したか。それが本当なら、何か間違った構成設定だと思います。

誰でも説明できますか?

于 2013-03-21T04:55:50.240 に答える
0

私の謙虚な意見では、結合は完全外部結合である必要があるため、両方のテーブルのレコードが一致しなくても結果に含まれます。確認してください: http://en.wikipedia.org/wiki/Join_%28SQL%29#Full_outer_join

于 2013-03-20T06:01:48.997 に答える