我有这样的查询
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'且 x2 = g strfldvar时,查询才适用于 x1 = g ='str2'等等,所以我试过了:
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的相关信息都保存在table4中。
我在这里做错了什么?
答案 0 :(得分:1)
您应该使用Inner连接而不是在整个表中运行扫描。实际上,在您的情况下,您正在从8表中选择数据,然后运行扫描整个数据,这实际上不是一个好技术。相反,您应该使用内部联接,它将在序列基础上扫描您的结果,并使您的查询相对较快。您的代码看起来像
SELECT * FROM table1 Inner join table2 On table1.a=table2.b
Inner join table3 On table2.b=table2.c
依旧......