关于与内部联接一起使用时的外部联接

时间:2018-08-15 21:52:03

标签: sql

问题:我是SQL的初学者,想验证我对LEFT OUTER JOINS的理解(使用Adventure Works数据库)。我已经了解了简单的LEFT OUTER JOIN是如何工作的。它将整个表放在左侧,并匹配它可以找到的任何正确的值,否则它将在右侧留下NULL。让我有些困惑的是,当您有一系列的内部联接之后是左侧联接。所以我的问题是下面的代码,考虑到LEFT端,LEFT OUTER JOIN的哪一侧?是FROM后面的值:

FROM **Person.Person** AS Pp

还是引用了INNER JOIN表之一?请参见下面的代码,谢谢!

DECLARE @Date AS NVARCHAR(60)
SET @Date = '2013-01-01'

DECLARE @Date1 AS NVARCHAR(60)
SET @Date1 = '2013-12-31'

DECLARE @Date2 AS NVARCHAR(60)
SET @Date2 = '2012-01-01'

DECLARE @Date3 AS NVARCHAR(60)
SET @Date3 = '2012-12-31'


SELECT Pp.FirstName + ' ' + Pp.LastName AS 'Name', 
Ph.PhoneNumber,Em.EmailAddress, St.Name AS 'Sales Territory',

(

SELECT SUM(Soh.TotalDue) AS 'TEST'
FROM Sales.SalesOrderHeader AS Soh
WHERE Soh.SalesPersonID = Pp.BusinessEntityID 

) AS 'Total Revenue',

(

((SELECT SUM(Soh.TotalDue) FROM Sales.SalesOrderHeader AS Soh WHERE 
Soh.OrderDate BETWEEN @Date AND @Date1 AND Soh.SalesPersonID = 
Pp.BusinessEntityID)-
(SELECT SUM(Soh.TotalDue) FROM Sales.SalesOrderHeader AS Soh  WHERE 
 Soh.OrderDate BETWEEN @Date2 AND @Date3 AND Soh.SalesPersonID = 
 Pp.BusinessEntityID))/
(SELECT SUM(Soh.TotalDue) FROM Sales.SalesOrderHeader AS Soh WHERE 
Soh.OrderDate BETWEEN @Date2 AND @Date3 AND Soh.SalesPersonID = 
Pp.BusinessEntityID)

) * 100 AS 'Percent Change In Rev'
FROM Person.Person AS Pp
INNER JOIN Person.PersonPhone AS Ph
ON Pp.BusinessEntityID = Ph.BusinessEntityID
INNER JOIN Person.EmailAddress AS Em
ON Pp.BusinessEntityID = Em.BusinessEntityID
INNER JOIN Sales.SalesPerson AS Sp
ON Sp.BusinessEntityID = Pp.BusinessEntityID
LEFT OUTER JOIN Sales.SalesTerritory AS St
ON Sp.TerritoryID = St.TerritoryID
ORDER BY 'Total Revenue' DESC

2 个答案:

答案 0 :(得分:0)

没有左外连接之类的东西。只有左,右,内和全(外)连接。

LEFT从左侧(从FROM侧)获取所有值,并将它们与右侧的任何结果相匹配。

右连接只执行相反的表,一个连接作为完整结果集。

内部仅找到匹配项。

外部查找所有内容,然后连接它可以连接的内容。

答案 1 :(得分:0)

当您进行一系列连接时,例如:

a inner join b inner join c inner join d left join e

然后将其视为:

(((a inner join b) inner join c) inner join d) left join e

这种语义解释,而不是联接的执行方式。而且这种解释与联接的类型无关。这是在FROM子句中不加括号的方式解释连接的方式。

现在,括号对理解没有太大帮助。因此,发生的情况是初始表全部内部连接在一起。这是结果集的行集。然后,left join将应用于这组行。有效:

(a inner join b inner join c inner join d) left join e

几乎所有目的,我都发现内部联接再加上左联接可以满足我的外部联接需求。例如,我从不使用right join。将内部联接和外部联接以另一种顺序混合-好吧,这会让我很头疼,想弄清楚结果集中是什么还是没有。