1

クエリの選択基準でテーブルのデータを使用する必要がある自己参照 SQL ステートメントの最適化に問題があります。

これは、ローカル変数を使用した例です。

SET @target_crit = (SELECT crit from table1 where id = 57)
SELECT * 
FROM table1
WHERE 
(@target_crit + crit > 100) AND 
(@target_crit * critb < 500) AND 
(@target_crit * critc >255)

ローカル変数を使用せずに複数の SELECT を使用する同じ例を次に示します。

SELECT * 
FROM table1
WHERE 
((SELECT crit from table1 where id = 57) + crit > 100) AND 
((SELECT crit from table1 where id = 57)* critb < 500) AND 
((SELECT crit from table1 where id = 57)* critc >255)

どちらも機能しますが、2 番目のクエリを最適化して、それらの SELECT がすべて不要になるようにする方法はありますか? CROSS JOIN のように見えますが、特定の列に参加していません。

これは MySQL であり、実際のクエリでは WHERE 句に 8 つの計算がありますが、例では 4 つしかありません。データ テーブルには約 100,000 のレコードがあります。

ありがとう!

4

1 に答える 1

3

セルフ ジョインの 2 つの可能性を次に示します。

-- Inner join with filter in join predicate
select *
from table1 as a
    join table1 as b on b.id = 57
where b.crit + a.crit > 100
    and b.crit * a.critb < 500
    and b.crit * a.critc > 255;

-- Cross join with filter in where clause
select *
from table1 as a
    cross join table1 as b
where b.id = 57
    and b.crit + a.crit > 100
    and b.crit * a.critb < 500
    and b.crit * a.critc > 255;

いずれにせよ、一意であることを願っidています。そうしないと、「重複した」行が得られます。

于 2013-09-25T18:34:10.837 に答える