请教联接与子查询的比较,哪个效率高,哪个功能强,如何根据情况选择用哪一种
--------------------------------------
有人说,子查询效率差,尽量不用。是这样吗?
子查询的功能,是不是一般用联接都可以实现呀,用联接是不是更好些呢?

解决方案 »

  1.   

    许多包含子查询的 Transact-SQL 语句都可以改用联接表示。其他问题只能通过子查询提出。在 Transact-SQL 中,包含子查询的语句和语义上等效的不包含子查询的语句在性能上通常没有差别。但是,在一些必须检查存在性的情况中,使用联接会产生更好的性能。否则,为确保消除重复值,必须为外部查询的每个结果都处理嵌套查询。所以在这些情况下,联接方式会产生更好的效果。以下示例显示了返回相同结果集的 SELECT 子查询和 SELECT 联接:/* SELECT statement built using a subquery. */
    SELECT Name
    FROM AdventureWorks.Production.Product
    WHERE ListPrice =
        (SELECT ListPrice
         FROM AdventureWorks.Production.Product
         WHERE Name = 'Chainring Bolts' )/* SELECT statement built using a join that returns
       the same result set. */
    SELECT Prd1. Name
    FROM AdventureWorks.Production.Product AS Prd1
         JOIN AdventureWorks.Production.Product AS Prd2
           ON (Prd1.ListPrice = Prd2.ListPrice)
    WHERE Prd2. Name = 'Chainring Bolts'
      

  2.   

    首先,让我们来看看连接类型。SQL Server可以使用三种不同的技术来连接资料表:嵌套循环(nested loop),散列(hash),以及合并(merge)。一般来说,嵌套循环是最快的连接类型,但如果不可能使用嵌套循环的话,则会用到散列或者合并作为合适的连接类型。两者都比嵌套循环连接慢。 
    当连接大表时,则合并连接可能是最佳选项,而非嵌套循环连接。唯一的明确这一点的方式是对两者都进行测试以查看哪一个最有效率。