0

こんな問い合わせがあります

SELECT *
FROM
table1,
table2,
table3,
table4,
table5,
table6,
table7,
table8
WHERE
a = b and
c = d and
e = d and
x1 = g and /*this is where x1 is changed into x2,x3,x4 or x5, labor intensive stuff*/ 
f = h and
i = j  

問題は、一部の j が一部の x1 から x5 などでのみ機能することです。これは、strfldvar と呼ばれるフィールドの変数に依存します。私が知っているのは、クエリがstrfldvar = 'str1' の場合にのみx1 = gに対してのみ機能し、 strfldvar = 'str2' の場合にのみx2 = gに対してのみ機能することです。

SELECT *
FROM
table1,
table2,
table3,
table4,
table5,
table6,
table7,
table8
WHERE
a = b and
c = d and
e = d and
(
(strfldvar = 'str1' AND x1 = g) 
OR (strfldvar = 'str2' AND x2 = g)
OR (strfldvar = 'str3' AND x3 = g)
OR (strfldvar = 'str4' AND x4 = g)
OR (strfldvar = 'str5' AND x5 = g)
)    and
f = h and
i = j 

これは実行に時間がかかり、クエリのタイムアウトによって停止します。背後にデカルト積があり、これが非常に複雑で時間がかかるため、明らかにクエリに問題があると思います。また、CASE THEN を使用して、WHERE の後に無関係で同じ結果が得られるすべての「=」をオフにしようとしました。JOIN、LEFT JOIN、OUTER JOIN、INNER JOIN、UNIONなどを実装してクエリを変更して、strfldvarのすべてのケースでこれを高速に動作させることはできますか、それとも簡単な答えはありませんか? strfldvar の各タイプの特定の情報は table4 から table8 に接続され、str1 タイプのレコードの追加情報は table4 に保持され、table8 と str5 およびその間のすべてについて同じです。

ここで何が間違っていますか?

4

1 に答える 1