Sql server 确定哪一个表位于联接的右侧和左侧
我对右外连接和左外连接很困惑。我对如何正确使用它们感到困惑。我所知道的唯一正确的连接是内部连接。我想问一些愚蠢的问题,但我问这些问题是为了让我能正确地理解它们 我怎么知道哪张桌子在右边和左边。这是由哪个连接决定的吗? 我问这些问题是因为我使用的是AdventureWorks数据库,我在下面的查询中做了一个左连接Sql server 确定哪一个表位于联接的右侧和左侧,sql-server,tsql,join,adventureworks,Sql Server,Tsql,Join,Adventureworks,我对右外连接和左外连接很困惑。我对如何正确使用它们感到困惑。我所知道的唯一正确的连接是内部连接。我想问一些愚蠢的问题,但我问这些问题是为了让我能正确地理解它们 我怎么知道哪张桌子在右边和左边。这是由哪个连接决定的吗? 我问这些问题是因为我使用的是AdventureWorks数据库,我在下面的查询中做了一个左连接 Select SalesLT.Customer.CompanyName, SalesLT.SalesOrderHeader.SubTotal, SalesLT.SalesOrderHea
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
这就是我得到的结果
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
在同一个查询中,我用右外部联接替换了左外部联接,得到了以下结果
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
我真的很困惑。请给我解释一下这里发生了什么事。可能是因为我没有正确地连接。如果我错了,纠正我
谢谢如果一个连接找到了所有行的匹配项,那么是的,它看起来就像一个内部连接。联接的外部部分是关于在找不到匹配项时发生的情况
左边或右边表示我们总是要保留哪些表的行。因此,在左联接中,您将始终获得联接左侧表中的所有行,但对于右侧不匹配的行,我们将获得null。对于右连接,我们总是将表中的所有行都移到右边
正如我所说,如果你在做一个左连接,并且左表中的每一行在右表中都至少有一个匹配行,那么结果将与内部连接相同。如果一个连接找到所有行都匹配,那么是的,它将看起来像一个内部连接。联接的外部部分是关于在找不到匹配项时发生的情况
左边或右边表示我们总是要保留哪些表的行。因此,在左联接中,您将始终获得联接左侧表中的所有行,但对于右侧不匹配的行,我们将获得null。对于右连接,我们总是将表中的所有行都移到右边
正如我所说,如果你在做一个左连接,并且左表中的每一行在右表中都至少有一个匹配的行,那么结果将与内部连接一样。返回所有有储物柜的学生
Select * from Student s
inner join locker l on s.StudentId = l.StudentId
返回所有学生,无论他们是否有储物柜
Select * from Student s
left join locker l on s.StudentId = l.StudentId
归还所有有储物柜的学生,以及所有储物柜(如果他们有或没有学生)
Select * from Student s
right join locker l on s.StudentId = l.StudentId
归还所有有储物柜的学生
Select * from Student s
inner join locker l on s.StudentId = l.StudentId
返回所有学生,无论他们是否有储物柜
Select * from Student s
left join locker l on s.StudentId = l.StudentId
归还所有有储物柜的学生,以及所有储物柜(如果他们有或没有学生)
Select * from Student s
right join locker l on s.StudentId = l.StudentId
我正在努力理解你所说的“我知道所有连接的定义”,如果你无法证明对连接的理解。可能的重复我将在@Damien_the_uncerver中编辑该部分左表是from子句中定义的表。选择*从学生左侧加入储物柜。。。将返回带或不带指定储物柜的学生。您的查询将返回所有客户,无论他们是否有SalesOrderheader,您能否至少解释一下,我的查询哪里出了问题?它没有解释为什么我使用右外部连接时,它的行为就像内部连接=。请向我解释@Damien_The_incensiver我正在努力理解你的意思,如果你无法证明对连接的理解,我知道所有连接的定义。可能的重复我将编辑该部分@Damien_The_incensiver左表是from子句中定义的表。选择*从学生左侧加入储物柜。。。将返回带或不带指定储物柜的学生。您的查询将返回所有客户,无论他们是否有SalesOrderheader,您能否至少解释一下,我的查询哪里出了问题?它没有解释为什么我使用右外部连接时,它的行为就像内部连接=。请向我解释一下“达米恩”这个不相信你的人,谢谢!!我更明白谢谢你!!我更明白