代码C7-联接和APPLY运算符.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
代码C7-联接和APPLY运算符

第7章 联接和APPLY运算符 7.1 联接的基本知识 7.1.3 列名限定和选择列表的使用 例如,下面的语句为表分配了别名,并且用表的别名对列加以限定,从而提高了语句的可读性: SELECT D.DepName, E.EmpID, E.EmpName FROM Departs AS D JOIN Employees AS E ON (D.DepID = E.DepID) 例如,在下面的语句中虽然E.EmpID列没有包含在SELECT列表中,但是仍旧通过该列进行数据筛选。 SELECT D.DepName, E.EmpName FROM Departs AS D JOIN Employees AS E ON (D.DepID = E.DepID) WHERE E.EmpID = 1 7.2.2 使用交叉联接查询全部数据 首先执行下面的语句创建两个示例表:Employees和Orders,表中内容分别如表7-6和表7-7所示。 CREATE TABLE Employees (EmpID int NOT NULL, EmpName char(10) NOT NULL); CREATE TABLE Orders ( EmpID int NOT NULL, SeasonNbr char(10) NOT NULL, Sales money DEFAULT 0.00 NOT NULL); INSERT INTO Employees VALUES (1, Grace), (2, Ken), (3, Tom); INSERT INTO Orders VALUES (1, Season 1, 100.00), (1, Season 2, 100.00), (2, Season 3, 120.00), (2, Season 4, 130.00); Employees中存放着雇员信息,Orders存放着雇员的季度销售数据。现在假设要返回雇员的每季度的销售数据。这个问题看起来似乎非常简单,但是请考虑一下,如果从Employees表到Orders表进行了仅执行像下面这样的标准内部联接(INNER JOIN),则只会获得雇员有销售数据的季度,如表7-8所示。 SELECT Employees.EmpName, Orders.SeasonNbr, Orders.Sales FROM Employees INNER JOIN Orders ON Employees.EmpID = Orders.EmpID; 可以使用交叉联接的方式解决此问题。创建一个名为Seasons的辅助表,表中存放着4个季度名称。 CREATE TABLE Seasons (SeasonNbr char(10)); INSERT INTO Seasons VALUES (Season 1), (Season 2), (Season 3), (Season 4); 对Employees表和Seasons表进行交叉联接,会得到如表7-9所示的查询结果。 SELECT * FROM Employees CROSS JOIN Seasons; 可以看到,交叉联接后的结果中每个雇员都具有了4个季度。然后再将该结果与Orders表进行左外联接,可以得到最终要求的数据格式。下面是完整查询语句,查询结果如表7-10所示。 SELECT Employees.EmpName, Seasons.SeasonNbr, CASE WHEN Orders.Sales IS NULL THEN 0 ELSE Orders.Sales END AS SeasonSales FROM Employees CROSS JOIN Seasons -- 交叉联接 LEFT OUTER JOIN Orders -- 再将交叉联接结果与Orders进行左外联结 ON Employees.EmpID = Orders.EmpID AND Seasons.SeasonNbr = Orders.SeasonNbr; 7.2.3 使用交叉联接优化查询性能 参考下面的语句: SELECT EmpID, SeasonNbr, Sales, CAST(Sales / (SELECT SUM(Sales) FROM Orders) * 100 AS decimal(5,2)) AS Per, Sales - (SELECT AVG(Sales) FROM Orders) AS Diff FROM O

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档