【问题标题】:Determine which Table goes on Right and Left for JOINS确定哪个表在右侧和左侧用于 JOINS
【发布时间】:2015-01-10 16:32:40
【问题描述】:

我真的对RIGHT OUTER JOINsLEFT 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

这是我得到的结果

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

在同一个查询中,我将 Left Outer Join Join 替换为 RIght Outer Join,得到以下结果

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

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

谢谢你

【问题讨论】:

  • 如果您无法证明对连接的理解,我很难理解 所说的“我知道所有连接的定义”是什么意思。
  • 我将编辑那部分 @Damien_The_Unbeliever
  • Left 表是在 from 子句中定义的表。 Select * from student left join locker... 将返回有或没有分配储物柜的学生。您的查询返回所有客户,无论他们是否有 SalesOrderheader
  • 你能至少解释一下,我在哪里做错了这个查询?它没有解释为什么当我使用 RIGHT OUTER JOIN 时,它的行为就像一个内部 Join=。请向我解释@Damien_The_Unbeliever

标签: sql-server tsql join adventureworks


【解决方案1】:

如果 JOIN 找到所有行的匹配项,那么是的,它将看起来像 INNER JOIN。连接的OUTER 部分是关于找不到匹配项时发生的情况。

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

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

【讨论】:

  • 谢谢你!!我明白了很多
【解决方案2】:

归还所有有储物柜的学生

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    相关资源
    最近更新 更多