0

b.int_name が c.d_name または c.b_name または d.syn と一致する場合に、テーブル a および b から行を抽出したい場合、以下のクエリは正しいですか?

SELECT DISTINCT a.n_id,
                a.dis,
                b.int_name
FROM cdb a,
     ct_int b,
     d_b c,
     d_syn d
WHERE a.dis LIKE '%hunt%' 
     && a.n_id=b.n_id 
     && b.int_name NOT LIKE 'NA' 
     && b.int_type NOT LIKE 'NA' 
     && (b.int_name NOT LIKE c.d_name
     OR b.int_name NOT LIKE c.b_name
     OR b.int_name NOT LIKE d.syn);

このクエリの実行には非常に時間がかかります。制限10または20で上記のクエリを実行している場合、すぐに送信されますが、制限なしで長時間スタックしているため、結果が得られるかどうかもわかりません。この点についてご指導ください。前もって感謝します...

4

1 に答える 1

0

まず第一に、非推奨の構文を使用せずに適切な結合を記述します。これにより、何をしているかを確認できます。

現在、1 つの良好な結合条件で 4 つのテーブルを結合しています。残りの結合は、特に「string not like string」結合のように見えることを行っているため、パフォーマンスが非常に悪くなります。本当に必要でない限り、データを正規化し、varchar で決して jon しないでください。第二にNOT LIKE、あなたの場合は と同等!=です。それを使用します。

2番目、

&& b.int_name NOT LIKE 'NA' 
&& b.int_type NOT LIKE 'NA' 

おそらく次のように書く方が速いでしょう

&& b.int_name != 'NA' 
&& b.int_type != 'NA' 

3 番目: テーブル構造と期待される結果を投稿します。おそらく、クロス結合に代わるものがあります。

于 2013-10-16T10:01:11.950 に答える