确定 JOINS 中哪个表位于右侧和左侧

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)

我真的很困惑。请向我解释一下这里发生了什么。这可能是因为我没有正确完成连接。如果我错了,请纠正我。

谢谢

Dam*_*ver 5

如果JOIN查找匹配所有行,那么是的,它将看起来像一个INNER JOIN. 连接部分OUTER是关于当找不到匹配项时会发生什么。

or表示我们始终想要保留哪个表的行LEFTRIGHT因此,在LEFT联接中,您始终会从联接左侧的表中获取所有行,但对于右侧没有匹配的行,我们会得到NULLs。对于RIGHT连接,我们总是从右侧的表中获取所有行。

正如我所说,如果您正在进行LEFT联接,并且左表中的每一行在右表中至少有一个匹配行,则结果看起来与INNER JOIN.


CSh*_*per 5

返回所有有储物柜的学生

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)