【问题标题】:Why first table should be in left and second on right in left/right join in sql server为什么在sql server的左/右连接中第一个表应该在左边,第二个在右边
【发布时间】:2016-05-13 16:11:33
【问题描述】:

我必须使用左外连接,我很困惑为什么我选择左边1个表和右边另一个表的逻辑,这背后有什么原因吗?

例如。我可以猜想左表应该是一个在加入列中具有 NULL 值的表

【问题讨论】:

  • 您从“左侧”表中获取所有行,并且仅在“左连接”中从“右侧”表中匹配行。这就是确切的含义,所以基本上,您想要哪个表中的所有行?
  • @ Lasse V. Karlsen-我的问题不在于左/右连接的功能。我的疑问是,我可以通过交换表名来实现左连接和右连接的相同结果,然后何时使用右/左

标签: sql-server join


【解决方案1】:

参考这个,

http://www.programmerinterview.com/index.php/database-sql/difference-between-a-left-outer-join-and-right-outer-join/

区别很简单——在左外连接中,将显示“左”表中的所有行,而不管“右”表中是否有任何匹配的列。在右外连接中,将显示“右”表中的所有行,而不管“左”表中是否有任何匹配的列。请参考共享 URL 中的示例。

请google一下,你可以找到你需要的。

【讨论】:

  • 我的问题不是关于左/右连接的功能。我的疑问是,我可以通过交换表名来实现左连接和右连接的相同结果,然后何时使用右/左
【解决方案2】:
CREATE TABLE #Evaluation (ID int IDENTITY(1,1), EvalName varchar(30), EvalDate datetime)
CREATE TABLE #EvaluationDetails (ID int IDENTITY(1,1), EvalID int, Points decimal(22,6), Question varchar(100) )


declare @Date datetime
set @Date = GETDATE()
INSERT INTO #Evaluation VALUES ('Specific question',@Date)

INSERT INTO #EvaluationDetails VALUES (1,10,'First question first evaluation')
INSERT INTO #EvaluationDetails VALUES (1,5,'SEcond question first evaluation')
INSERT INTO #EvaluationDetails VALUES (1,0,'Third question first evaluation')

INSERT INTO #EvaluationDetails VALUES (null,0,'First question therd evaluation')


SELECT * FROM #Evaluation  e
join #EvaluationDetails ed on ed.EvalID = e.ID

SELECT * FROM #Evaluation e
left join #EvaluationDetails ed on ed.EvalID = e.ID

SELECT * FROM #Evaluation e
right join #EvaluationDetails ed on ed.EvalID = e.ID



DROP TABLE #Evaluation
DROP TABLE #EvaluationDetails

让我们看下面的例子。查询结果(join/left/right)

如您所见,我们有 2 个评估,它们的详细信息在另一个表中。这是你想要得到的东西。如果您有兴趣获得所有包含详细信息(问题)的评估。你做一个简单的连接。如果您想获得所有评估,即使是那些没有答案的评估,您也可以在#Evaluation#EvaluationDetails 之间进行左连接。如果您想获得所有问题,即使是没有评估的问题,您也可以正确加入。

这就是连接的工作方式。当然,如果您切换表并将#EvaluationDetails#Evaluation 连接,您也会切换连接,因此左连接变为右连接,右连接变为左连接。

【讨论】:

  • @ CiucaS - 我的问题不是关于左/右连接的功能。我的疑问是,我可以通过交换表名来实现左连接和右连接的相同结果,然后何时使用右/左
  • @BrijeshKumar 我想我发现的唯一区别是使用SELECT * FROM 因为列将以将表添加到联接的方式显示。因此,交换连接和表将导致不同的列显示,并且可能会影响 Order by 子句(Order by 可以与 1、2、3 一起用作 select 的列号)。
猜你喜欢
  • 1970-01-01
  • 2013-11-02
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
相关资源
最近更新 更多