我必须用两种不同的方式编写sql查询,两者都给出相同的输出。但还是不明白
两个查询之间有什么不同?
哪一个快速访问?
哪个更值得推荐?
查询#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
答案 0 :(得分:1)
- 两个查询之间有什么不同?
醇>
一个使用INNER JOIN
,另一个不使用FROM
。只列出JOIN
子句中用逗号分隔的所有表都是较旧的样式/语法,这些日子大部分已被弃用。它是从OUTER
语法引入标准之前开始的。
- 哪一个快速访问?
醇>
他们的表现应该同样出色。您必须生成执行计划才能确定,但优化程序应该平等对待它们。
- 哪个更推荐?
醇>
第一个。使联接明确且与任何过滤不同可以帮助其他人在将来理解查询。此外,只要引入{{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会将您的第二个查询更改为第一个。