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