因为万网使用的MySQL是4.0.24不支持子查询(MySQL从4.1开始支持),不得已要将现有的SQL语句涉及子查询的转化为连接:
以下是我google到的一些资料:
将 WHERE 子句中的子查询转换为连接
Adaptive Server Anywhere 查询优化程序会对一些多层查询进行转换,以
使用连接。执行这一转换不需要任何用户操作。本节将介绍哪些子查询
可转换为连接,以便您可以了解数据库中的查询的性能。
问题 [Clarke 女士和 Suresh 女士何时下的订单,并且是向哪些销售代表示例
下的订单? ] 可表示为两层查询:
或者,可以采用同样正确的方法来表示为使用连接的查询:
要将多层查询改写为连接必须满足一定的条件,运算符的类型不同,这
些条件也将有所不同。请回忆一下子查询出现在查询的 WHERE 子句中
的情况,其形式如下
子查询是否可转换为连接取决于多种因素,例如运算符的类型、查询的
结构和子查询的结构等。
下面是我的通用的解决方案:
查询:
可以被写成:
或者使用一个内连接:
查询:
可以被写成:
参考资料:
http://corp.avantgo.com/developer/product_manuals/sqlanywhere/0902/zh/html/dbfgzh9/00000172.htm
Adaptive Server® Anywhere
SQL 用户指南
http://topic.csdn.net/t/20020813/09/935770.html
将一个子查询转换成外部连接
以下是我google到的一些资料:
将 WHERE 子句中的子查询转换为连接
Adaptive Server Anywhere 查询优化程序会对一些多层查询进行转换,以
使用连接。执行这一转换不需要任何用户操作。本节将介绍哪些子查询
可转换为连接,以便您可以了解数据库中的查询的性能。
问题 [Clarke 女士和 Suresh 女士何时下的订单,并且是向哪些销售代表示例
下的订单? ] 可表示为两层查询:
sql 代码
- SELECT order_date, sales_rep
- FROM sales_order
- WHERE cust_id IN (
- SELECT id
- FROM customer
- WHERE lname = 'Clarke' OR fname = 'Suresh')
或者,可以采用同样正确的方法来表示为使用连接的查询:
sql 代码
- SELECT fname, lname, order_date, sales_rep
- FROM sales_order, customer
- WHERE cust_id=customer.id AND
- (lname = 'Clarke' OR fname = 'Suresh')
要将多层查询改写为连接必须满足一定的条件,运算符的类型不同,这
些条件也将有所不同。请回忆一下子查询出现在查询的 WHERE 子句中
的情况,其形式如下
sql 代码
- SELECT select-list
- FROM table
- WHERE
- [NOT] expression comparison-operator ( subquery )
- | [NOT] expression comparison-operator { ANY | SOME } ( subquery )
- | [NOT] expression comparison-operator ALL ( subquery )
- | [NOT] expression IN ( subquery )
- | [NOT] EXISTS ( subquery )
- GROUP BY group-by-expression
- HAVING search-condition
子查询是否可转换为连接取决于多种因素,例如运算符的类型、查询的
结构和子查询的结构等。
下面是我的通用的解决方案:
查询:
sql 代码
- SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);
可以被写成:
sql 代码
- SELECT table1.* FROM table1,table2 WHERE table1.id=table2.id;
sql 代码
- SELECT table1.* FROM table2 INNER JOIN table1 ON table1.id=table2.id;
查询:
sql 代码
- SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2);
- SELECT * FROM table1 WHERE NOT EXISTS (SELECT id FROM table2 WHERE table1.id=table2.id);
可以被写成:
sql 代码
- SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id WHERE table2.id IS NULL;
参考资料:
http://corp.avantgo.com/developer/product_manuals/sqlanywhere/0902/zh/html/dbfgzh9/00000172.htm
Adaptive Server® Anywhere
SQL 用户指南
http://topic.csdn.net/t/20020813/09/935770.html
将一个子查询转换成外部连接