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)

这是没有局部变量但使用多个 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 条记录。

谢谢!

4

1 回答 1

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

于 2013-09-25T18:34:10.837 回答