特殊联接查询

除了传统的三种联接查询外,还有一些特殊的联接查询。这篇文章就将对其进行总结,主要有以下几种特殊的联接查询。

1,组合联接查询

2,不等联接查询

3,多表联接查询

组合联接查询

组合联接就是联接条件涉及联接两边的多个列的查询。当需要根据主键-外键关系来联接两个表,而且主外键关系是组合的(即关系基于多个列)时,通常就要使用组合联接。

例如,假设dbo.Table2表上定义了两个外键(col1列和col2列),引用了dbo.Table1表的col1和col2列,现在要写一个根据主外键关系来联接两个表的查询语句。该查询语句可以写成下面这样:

-- 组合联接查询
FROM dbo.Table1 AS T1
JOIN dbo.Table2 AS T2 ON T1.col1= T2.col1 AND T1.col2= T2.col2

不等联接查询

联接条件只包含等号运算符的联接我们一般称之为等值联接。而不等联接刚好相反,它的联接条件包含除了等号以外的其它运算符。

作为一个不等联接查询的例子,以下查询语句对Employees表的两个实例进行联接,以生成职员之间的唯一配对。

USE TSQLFundamentals2008;
GO

-- 不等联接查询
SELECT employees1.empid,employees1.firstname,employees1.lastname,employees2.empid,employees2.firstname,employees2.lastname 
FROM HR.Employees AS employees1
JOIN HR.Employees AS employees2 ON employees1.empid<employees2.empid
ORDER BY employees1.empid

查询结果:

image

多表联接查询

如果说上面两种特殊联接用得还比较少的话,那么多表联接查询用得就比较多。

一个联接表运算符只对两个表进行操作,而一条查询语句可以包含多个联接。通常,当FROM子句中包含多个表运算符时,表运算符在逻辑上是按从左到右的顺序处理的。也就是说,第一个表运算符的结果表将作为第二个表运算符的输入,第二个表运算符的结果将作为第三个表运算符左边的输入,以此类推。

所以如果FROM子句中包含多个联接,逻辑上只有第一个联接对两个基础表进行操作,而其他联接则将前一个联接的结果作为其左边的输入。

例如,以下查询先对Customers表和Orders表进行联接,以匹配客户和它们的订单,再把第一个联接的结果表和OrderDetails表进行联接,以匹配订单和订单详情。

SQL查询代码:

-- 多表联接查询
SELECT customers.custid,customers.companyname,orders.orderid,orderdetails.productid,orderdetails.qty 
FROM Sales.Customers AS customers
LEFT JOIN Sales.Orders AS orders ON customers.custid = orders.custid
LEFT JOIN Sales.OrderDetails AS orderdetails ON orders.orderid = orderdetails.orderid
ORDER BY customers.custid;

查询结果:

image

原文地址:https://www.cnblogs.com/mcgrady/p/3883687.html