除了传统的三种联接查询外,还有一些特殊的联接查询。这篇文章就将对其进行总结,主要有以下几种特殊的联接查询。
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
查询结果:
多表联接查询
如果说上面两种特殊联接用得还比较少的话,那么多表联接查询用得就比较多。
一个联接表运算符只对两个表进行操作,而一条查询语句可以包含多个联接。通常,当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;
查询结果: