`
syhan
  • 浏览: 58053 次
  • 性别: Icon_minigender_1
  • 来自: Southeast University
社区版块
存档分类
最新评论

子查询转连接的一点

阅读更多
因为万网使用的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
将一个子查询转换成外部连接
分享到:
评论

相关推荐

    SQL Server嵌套查询.pdf

    举例来说,如果我们需要查询与特定人员处于同一部门的所有读者信息,我们可以先通过子查询找到那个人所在部门的名称,然后再执行外查询并使用比较运算符连接子查询的结果。这里需要注意的是,单行子查询返回值必须...

    SQL语句高级查询

    - **子查询(Subquery)**: 子查询是在一个SELECT语句中嵌套另一个SELECT语句,用于获取内部查询的结果作为外部查询的条件。例如,在查找速度至少为180赫兹的PC机的厂商时,首先从`pc`表中筛选出符合条件的型号,再...

    Oracle查询优化改写 技巧与案例

    3. **子查询优化**:合理使用子查询可以提高查询效率,如嵌套查询的替换、子查询转连接操作等。 4. **连接(JOIN)优化**:学习不同类型的JOIN(如INNER JOIN、LEFT JOIN、RIGHT JOIN)及其对性能的影响,以及如何...

    SQLServer数据库设计和高级查询6_1

    综上所述,《SQLServer数据库设计和高级查询6_1》涵盖了一系列深入的理论与实践知识,从规范化和实体关系建模,到索引优化、子查询、连接查询、窗口函数及事务管理,每一点都是构建高效、稳定和安全数据库系统的基石...

    pbootcms数据sqlite转mysql数据库

    2. **SQL语法差异**:例如,SQLite支持的子查询语法在MySQL中可能需要调整,还有一些特定函数的使用也可能不同。 3. **事务处理**:SQLite默认开启自动提交,而MySQL需要手动开启和提交事务,转换过程中需要注意这...

    SQL面试宝典2010版

    这条语句使用子查询来获取所有分数小于或等于 80 的学生姓名,然后使用 NOT IN 语句来排除这些学生,最后获取到每门课都大于 80 分的学生姓名。 2. 删除冗余信息 在这个问题中,我们需要删除除了自动编号不同,...

    -------------------------------------------------------

    此外,优化查询语句也很关键,避免使用复杂的子查询和过多的磁盘I/O操作,可以提升系统响应速度。 开发者还需要了解SqlCe的连接池机制,它能有效地管理数据库连接,减少创建和销毁连接的开销,从而提高系统的整体...

    MySQL多表查询

    通过子查询,我们可以实现这一点,从而简化查询结果并提高性能。 总结来说,多表查询是MySQL中非常实用的功能之一,它可以让我们灵活地处理复杂的数据关系。掌握多表查询的各种方法,对于提高查询效率和准确性至关...

    一点sql语句总结

    - 子查询可以在SELECT、FROM或WHERE子句中嵌套,用于执行复杂查询。 - 子查询可以作为另一个查询的一部分,帮助筛选数据。 5. **视图**: - 视图是虚拟表,基于一个或多个表的查询结果。它们可以简化复杂的查询...

    活动活动大脑的一个稍微复杂一点的sql

    1. **子查询**:子查询是在一个查询语句内部嵌套另一个查询,常用于筛选满足特定条件的数据。 2. **联接(JOIN)**:用于合并两个或多个表的数据,如内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT ...

    10倍以上提高Pentaho Kettle的MySQL写入速度

    3. **并发执行**: 利用Kettle的工作线程机制,可以将数据加载任务分割成多个子任务并行执行,从而充分利用多核CPU资源。 4. **预处理数据**: 在写入数据库之前,对数据进行预处理,如删除重复值、转换格式等,可以...

    电子政务-断路器电连接器.zip

    断路器电连接器的智能控制有助于实现这一点。 5. **安全性与合规性**:电子政务系统可确保电力设施符合国家安全标准和法规,通过记录和报告功能,便于监管和审计,提高整体安全水平。 6. **应急响应与恢复**:在...

    VB学习一点通

    - **DAO**:较旧的数据访问技术,也可用于连接数据库,但已被ADO.NET取代。 8. **错误处理** - **On Error**:通过`On Error Resume Next`或`On Error GoTo 0`设置错误处理模式。 - **Try...Catch...Finally**:...

    oracle查询优化

    在涉及子查询的场景中,EXISTS关键字通常比IN提供更好的性能,特别是在子查询返回大量行的情况下。这是因为EXISTS只需找到一个匹配即可返回真,而IN则需要遍历整个子查询结果集。因此,在设计查询时,优先考虑使用...

    电子英汉词典

    为了实现这一点,《电子英汉词典》设计了一套高效的查询算法。当用户输入单词时,程序会通过Access数据库进行快速查找,返回相应的翻译结果。Access数据库以其优秀的数据管理能力,支持大量数据的存储,同时提供了...

    SQL学习笔记一

    这些子查询可以作为外部查询的条件,也可以在`IN`、`NOT IN`、`EXISTS`或`NOT EXISTS`等子句中使用。 在工具方面,有许多优秀的SQL编辑器和数据库管理工具,如MySQL Workbench、Navicat、SQL Server Management ...

    sql优化技巧

    尽量减少对同一表的多次查询,可以通过使用子查询或临时表等方式来实现这一点。 **8. 合理的使用COMMIT** COMMIT操作会将未提交的事务写入数据库,从而释放锁。合理地使用COMMIT可以减少锁定时间,提高并发性能。 ...

    geek学习 有空就学习一点啦

    6. 子查询:在主查询中嵌套查询,用于获取特定条件的结果。 7. 视图:虚拟表,基于一个或多个表的查询结果。 8. 存储过程和触发器:预编译的SQL语句集合,可以提高性能并简化复杂操作。 Java,由Sun Microsystems...

Global site tag (gtag.js) - Google Analytics