SQL查询中的内连接和比较运算符有什么不同

时间:2013-02-12 07:56:26

标签: sql sql-server-2008

我必须用两种不同的方式编写sql查询,两者都给出相同的输出。但还是不明白

  1. 两个查询之间有什么不同?

  2. 哪一个快速访问?

  3. 哪个更值得推荐?

  4. 查询#1

    SELECT PageControlDet.PageId, PageMaster.PageName, PageMaster.PageURL, 
           PageMaster.PageTitle, PageMaster.PageDescription
    FROM AgentRoleAccessDet 
    INNER JOIN PageControlDet ON AgentRoleAccessDet.ControlId = PageControlDet.ControlId
    INNER JOIN PageMaster ON PageControlDet.PageId = PageMaster.PageId 
    

    查询#2

    SELECT PageControlDet.PageId, PageMaster.PageName, PageMaster.PageURL, 
           PageMaster.PageTitle, PageMaster.PageDescription
    FROM   AgentRoleAccessDet,  PageControlDet, PageMaster
    WHERE  AgentRoleAccessDet.ControlId = PageControlDet.ControlId and
        PageControlDet.PageId = PageMaster.PageId 
    ORDER BY PageControlDet.PageId
    

3 个答案:

答案 0 :(得分:1)

  
      
  1. 两个查询之间有什么不同?
  2.   

一个使用INNER JOIN,另一个不使用FROM。只列出JOIN子句中用逗号分隔的所有表都是较旧的样式/语法,这些日子大部分已被弃用。它是从OUTER语法引入标准之前开始的。

  
      
  1. 哪一个快速访问?
  2.   

他们的表现应该同样出色。您必须生成执行计划才能确定,但​​优化程序应该平等对待它们。

  
      
  1. 哪个更推荐?
  2.   

第一个。使联接明确且与任何过滤不同可以帮助其他人在将来理解查询。此外,只要引入{{1}}联接,就需要使用不推荐的语法来使用第二种样式。

答案 1 :(得分:0)

你绝对应该使用内连接。

不推荐在From部分中指定多个表,这可能导致不明确的查询解释。有关详细信息,请参阅this answer

答案 2 :(得分:0)

在第二个示例中,您的查询等同于:

SELECT PageControlDet.PageId, PageMaster.PageName, PageMaster.PageURL, 
       PageMaster.PageTitle, PageMaster.PageDescription
FROM   AgentRoleAccessDet
CROSS JOIN PageControlDet 
CROSS JOIN PageMaster
WHERE  AgentRoleAccessDet.ControlId = PageControlDet.ControlId and
       PageControlDet.PageId = PageMaster.PageId 
ORDER BY PageControlDet.PageId

使用不带此关键字的交叉连接(以逗号分隔的表格列表)是旧语法,TSQL支持(旧的和新的CROSS Join关键字)。 交叉加入将生成笛卡尔积。 由于您的示例,我更喜欢第一个查询 - 因为它根据查询逻辑更具可读性,可理解性和格式。关于性能:我认为MSSQL Optimizer会将您的第二个查询更改为第一个。