如何将限制(缩小)添加到表变量?例如,
select * from Employee e
where (e.type=1 and e.salary>100) and
(e.type=1 and e.age>20) or
(e.type=1 and e.city='Foo')
有很多e.type=1
。对于这个特定的例子,它可以简化。
通常,是否可以用新的表变量(标识符)替换它?例如,
select * from Employee e
LEFT join (select e.* where e.type=1) g
where g.salary>100 and g.age>20 or g.city='FOO'
MySQL错误:未知表e。
以下情况如何?
select * from Employee e
LEFT join (select * from Employee em) as g on (g.id=e.id and e.type=1)
where g.salary>100 and g.age>20 or g.city='FOO'
使用此子查询加入的性能如何?如果数据库足够智能,则应该花时间来评估动态连接表(子查询),因为连接条件(on)的结果是同一行。对于流行的数据库,例如Mysql,oracle,SQL server,sqlite等,这是真的吗?
答案 0 :(得分:1)
或者,将其写为:
select e.*
from Employee e
where e.type = 1 and
(e.salary > 100 or e.age > 20 or e.city = 'Foo');
join
根本不适合这种逻辑。没有join
子句的on
是一个破坏的查询(MySQL确实在某些情况下允许它,但几乎没有其他数据库允许它。)
答案 1 :(得分:0)
我不认为加入是一种解决方案 这是您查询的简化版本。
select *
from Employee e
where e.type = 1
and e.salary > 10
and (e.age > 20 or e.city = 'Foo')