我在优化自引用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)
以下是没有局部变量但使用多个SELECTS
的相同示例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)
两者都有效,但有没有办法优化第二个查询,以便不需要所有这些SELECT?看起来像一个CROSS JOIN,但我没有加入特定的专栏。
这是MySQL,实际查询在WHERE子句中有8个计算,而我只有4个例子。数据表中有大约100k条记录。
谢谢!
答案 0 :(得分:3)
以下是您自我加入的两种可能性:
-- 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
是唯一的,否则你会得到“重复”的行。