SQL:如何向表变量添加限制?

时间:2018-05-04 13:49:55

标签: mysql sql join

如何将限制(缩小)添加到表变量?例如,

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等,这是真的吗?

2 个答案:

答案 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')