0

これが可能であれば、より単純なロジックでこのブロックを書き直そうとしています。私はより大きなSELECTステートメント内でそれを使用していますが、このブロックを単純化できれば、クエリのパフォーマンスを向上できると思います。

proj_catg_type_idproj_catg_idおよびproj_idそれらのテーブル内のすべての PK です。

select  t1.proj_catg_name
from    table1 t1, table2 t2, table3 t3
where   t2.proj_catg_type_id = t1.proj_catg_type_id
and     t2.proj_catg_type_id = 213
and     t3.proj_id = t2.proj_id
4

3 に答える 3

0
select t1.proj_catg_name
from    table1 t1 inner join table2 t2     
on   t2.proj_catg_type_id=t1.proj_catg_type_id
where t2.proj_catg_type_id=213
and t3.proj_id=t2.proj_i

多分?t3 はこのサブセレクトの外で使用されていますか?

于 2013-01-23T19:00:50.467 に答える
0

参照整合性ルールとテーブルの背後にあるロジックを知らなければ、100% 正しい答えを出すことは困難です。しかし、このステートメントを見るだけで、最も単純化されたロジックは次のようになります。

select t1.proj_catg_name
from    table1 t1
where   t1.proj_catg_type_id = 213;
于 2013-01-23T19:34:27.037 に答える
-2

もし t3 があなたが示した選択範囲外のテーブルである場合、これは絶対に使用してはならない相関サブクエリです! これにより、クエリが行カーソルによって行に変換されます。

派生テーブルまたは結合を使用して結果を取得します。

問題の特定の解決策を書くのに十分なコードを提供してくれませんが、例を挙げましょう。

SELECT 
      field1
    , field2
    , (SELECT t3.field3 
        FROM table2 t2 
        JOIN table3 t3 ON t2.id = t3.id
        WHERE t4.somefield = t2.somefield)
FROM table1 t1
JOIn table4 t4 ON t1.id = t4.id

SELECT 
      field1
    , field2
    , t3.field3 
FROM table1 t1
JOIn table4 t4 
    ON t1.id = t4.id
join (SELECT field3 
        FROM table2 t2 
        JOIN table3 t3 ON t2.id = t3.id) a
    ON  t4.somefield = t2.somefield

最初のクエリは一度に 1 行ずつ実行されるため、非常に低速です。2 番目は同じ結果が得られるはずですが、はるかに高速なセットベースの方法で実行されます。派生テーブルにエイリアスがあることを確認することが重要です。CTE を使用することもできます。

于 2013-01-23T20:04:38.333 に答える