子查询转连接的一点

因为万网使用的MySQL是4.0.24不支持子查询(MySQL从4.1开始支持),不得已要将现有的SQL语句涉及子查询的转化为连接:
以下是我google到的一些资料:
将 WHERE 子句中的子查询转换为连接
           Adaptive Server Anywhere 查询优化程序会对一些多层查询进行转换,以
           使用连接。执行这一转换不需要任何用户操作。本节将介绍哪些子查询
           可转换为连接,以便您可以了解数据库中的查询的性能。
           问题 [Clarke 女士和 Suresh 女士何时下的订单,并且是向哪些销售代表示例
           下的订单? ] 可表示为两层查询:
            
sql 代码
 
  1. SELECT order_date, sales_rep  
  2.                  FROM sales_order  
  3.                  WHERE cust_id IN (  
  4.                      SELECT id  
  5.                      FROM customer  
  6.                      WHERE lname = 'Clarke' OR fname = 'Suresh')  

           或者,可以采用同样正确的方法来表示为使用连接的查询:
            
sql 代码
 
  1. SELECT fname, lname, order_date, sales_rep  
  2.                  FROM sales_order, customer  
  3.                  WHERE cust_id=customer.id AND  
  4.                    (lname = 'Clarke' OR fname = 'Suresh')  

           要将多层查询改写为连接必须满足一定的条件,运算符的类型不同,这
           些条件也将有所不同。请回忆一下子查询出现在查询的 WHERE 子句中
           的情况,其形式如下
       
sql 代码
 
  1. SELECT select-list  
  2.            FROM table  
  3.            WHERE  
  4.            [NOT] expression comparison-operator ( subquery )  
  5.            | [NOT] expression comparison-operator { ANY | SOME } ( subquery )  
  6.            | [NOT] expression comparison-operator ALL ( subquery )  
  7.            | [NOT] expression IN ( subquery )  
  8.            | [NOT] EXISTS ( subquery )  
  9.            GROUP BY group-by-expression  
  10.            HAVING search-condition  

           子查询是否可转换为连接取决于多种因素,例如运算符的类型、查询的
           结构和子查询的结构等。


下面是我的通用的解决方案:

查询:      
sql 代码
 
  1. SELECTFROM table1  WHERE  id  IN  (SELECT  id  FROM table2);         

  可以被写成:      
sql 代码
 
  1. SELECT  table1.*  FROM  table1,table2  WHERE  table1.id=table2.id;         
或者使用一个内连接:
sql 代码
 
  1. SELECT table1.* FROM table2 INNER JOIN table1 ON table1.id=table2.id;  

     
  查询:          
sql 代码
 
  1. SELECT  *  FROM   table1  WHERE  id  NOT  IN   (SELECT  id  FROM  table2);        
  2. SELECT  *  FROM   table1  WHERE  NOT  EXISTS  (SELECT  id  FROM  table2 WHERE  table1.id=table2.id);   
   
  可以被写成:      
sql 代码
 
  1. 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
将一个子查询转换成外部连接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值