使用计算自引用SQL查询

时间:2013-09-25 18:18:53

标签: mysql sql self-join

我在优化自引用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条记录。

谢谢!

1 个答案:

答案 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是唯一的,否则你会得到“重复”的行。