问题:我是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
答案 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
。将内部联接和外部联接以另一种顺序混合-好吧,这会让我很头疼,想弄清楚结果集中是什么还是没有。