1

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

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

  2. 哪一个访问速度快?

  3. 哪个更推荐?

查询 #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
4

3 回答 3

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

一个用INNER JOIN,另一个不用。仅列出FROM子句中的所有表,用逗号分隔是一种较旧的样式/语法,这些天大多已弃用。这是在JOIN语法被引入标准之前。

  1. 哪一个访问速度快?

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

  1. 哪个更推荐?

首先。使联接显式且有别于任何过滤可以帮助其他人在将来理解查询。此外,一旦您引入OUTER连接,您就需要使用不推荐使用的语法来使用第二种样式。

于 2013-02-12T08:06:19.373 回答
0

您绝对应该使用内部联接。

在该部分中指定多个表From已被弃用,并且可能导致查询解释不明确。有关更多详细信息,请参阅此答案

于 2013-02-12T08:04:14.387 回答
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 连接关键字的旧和新)。交叉连接将产生笛卡尔积。由于您的示例,我更喜欢第一个查询 - 因为根据查询逻辑,它更具可读性、可理解性和格式良好。关于性能:我认为 MSSQL Optimizer 会将您的第二个查询更改为第一个。

于 2013-02-12T08:19:01.363 回答