mfr*_*edy 1 t-sql sql-server join adventureworks
我对RIGHT OUTER JOINs和真的很困惑LEFT OUTER JOINs。我真的很困惑如何正确使用它们。我在INNER JOIN. 我会问一些愚蠢的问题,但我问这些问题是为了让我正确理解它们。
我怎么知道哪张桌子应该放在右边和左边。这是由哪个连接决定的吗?
我问所有这些问题是因为我正在使用 AdventureWorks 数据库并且我正在对下面的查询执行 LEFT JOIN
Select SalesLT.Customer.CompanyName, SalesLT.SalesOrderHeader.SubTotal, SalesLT.SalesOrderHeader.TaxAmt
FROM SalesLT.Customer
LEFT OUTER JOIN SalesLT.SalesOrderHeader
ON SalesLT.Customer.CustomerID = SalesLT.SalesOrderHeader.CustomerID
Run Code Online (Sandbox Code Playgroud)
这是我得到的结果
A Bike Store NULL NULL
Progressive Sports NULL NULL
Advanced Bike Components NULL NULL
Modular Cycle Systems NULL NULL
Metropolitan Sports Supply NULL NULL
Aerobic Exercise Company NULL NULL
Associated Bikes NULL NULL
Rural Cycle Emporium NULL NULL
Sharp Bikes NULL NULL
Bikes and Motorbikes NULL NULL
Run Code Online (Sandbox Code Playgroud)
在同一查询中,我将左外连接替换为右外连接,得到以下结果
Professional Sales and Service 39785.3304 3182.8264
Remarkable Bike Store 6634.2961 530.7437
Bulk Discount Store 88812.8625 7105.029
Coalition Bike Company 2415.6727 193.2538
Futuristic Bikes 246.7392 19.7391
Channel Outlet 550.386 44.0309
Aerobic Exercise Company 2137.231 170.9785
Vigorous Sports Store 1059.31 84.7448
Run Code Online (Sandbox Code Playgroud)
我真的很困惑。请向我解释一下这里发生了什么。这可能是因为我没有正确完成连接。如果我错了,请纠正我。
谢谢
如果JOIN查找匹配所有行,那么是的,它将看起来像一个INNER JOIN. 连接部分OUTER是关于当找不到匹配项时会发生什么。
or表示我们始终想要保留哪个表的行LEFT。RIGHT因此,在LEFT联接中,您始终会从联接左侧的表中获取所有行,但对于右侧没有匹配的行,我们会得到NULLs。对于RIGHT连接,我们总是从右侧的表中获取所有行。
正如我所说,如果您正在进行LEFT联接,并且左表中的每一行在右表中至少有一个匹配行,则结果看起来与INNER JOIN.
返回所有有储物柜的学生
Select * from Student s
inner join locker l on s.StudentId = l.StudentId
Run Code Online (Sandbox Code Playgroud)
返回所有学生,无论他们是否有储物柜。
Select * from Student s
left join locker l on s.StudentId = l.StudentId
Run Code Online (Sandbox Code Playgroud)
返回所有有储物柜的学生,以及所有储物柜(无论是否有学生)
Select * from Student s
right join locker l on s.StudentId = l.StudentId
Run Code Online (Sandbox Code Playgroud)