例如,有两个表:
create table Table1 (id int, Name varchar (10))
create table Table2 (id int, Name varchar (10))
表1数据如下:
Id Name
-------------
1 A
2 B
表2数据如下:
Id Name
-------------
1 A
2 B
3 C
如果我执行下面提到的两个 SQL 语句,两个输出将是相同的:
select *
from Table1
left join Table2 on Table1.id = Table2.id
select *
from Table2
right join Table1 on Table1.id = Table2.id
请说明上述 SQL 语句中左连接和右连接的区别。
Select * from Table1 left join Table2 ...
和
Select * from Table2 right join Table1 ...
确实是完全可以互换的。但是,请尝试 Table2 left join Table1
(或其相同的一对 Table1 right join Table2
)来查看差异。这个查询应该给你更多的行,因为 Table2 包含一个 ID 不在 Table1 中的行。
您从中获取数据的表是“左”。您要加入的表是“正确的”。 LEFT JOIN:从左表中取出所有项目和(仅)从右表中匹配项目。 RIGHT JOIN:从右表中取出所有项目和(仅)从左表中匹配项目。所以:
Select * from Table1 left join Table2 on Table1.id = Table2.id
给出:
Id Name
-------------
1 A
2 B
但:
Select * from Table1 right join Table2 on Table1.id = Table2.id
给出:
Id Name
-------------
1 A
2 B
3 C
你是右加入表,表上的行少,行多,再一次,左加入表,表上的行少,行多试试:
If Table1.Rows.Count > Table2.Rows.Count Then
' Left Join
Else
' Right Join
End If
您似乎在问,“如果我可以使用 LEFT OUTER JOIN
语法重写 RIGHT OUTER JOIN
,那么为什么还要使用 RIGHT OUTER JOIN
语法?”我认为这个问题的答案是,因为语言的设计者不想对用户施加这样的限制(我认为如果他们这样做会受到批评),这会迫使用户改变表格的顺序在某些情况下仅更改联接类型时,在 FROM
子句中。
select fields
from tableA --left
left join tableB --right
on tableA.key = tableB.key
此示例 tableA
中的 from
中的表位于关系的左侧。
tableA <- tableB
[left]------[right]
因此,如果您想从左表 (tableA
) 中取出所有行,即使右表 (tableB
) 中没有匹配项,您也将使用“左连接”。
如果您想从右表 (tableB
) 中取出所有行,即使左表 (tableA
) 中没有匹配项,您也将使用 right join
。
因此,以下查询等同于上面使用的查询。
select fields
from tableB
right join tableA on tableB.key = tableA.key
你的两个陈述是等价的。
大多数人只使用 LEFT JOIN
,因为它看起来更直观,而且它是通用语法 - 我认为并非所有 RDBMS 都支持 RIGHT JOIN
。
LEFT
但不支持 RIGHT
,请指出哪些产品。
我觉得我们可能需要 Outer Excluding JOIN
最后一个数字的 where
子句中的 AND
条件,以便我们得到 A Union B Minus A Interaction B
的预期结果。我觉得查询需要更新为
SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL AND B.Key IS NULL
如果我们使用 OR
,那么我们将得到 A Union B
的所有结果
select * from Table1 left join Table2 on Table1.id = Table2.id
在第一个查询中,左连接将左侧表 table1 与右侧表 table2 进行比较。
其中将显示 table1 的所有属性,而在 table2 中仅显示条件为真的那些属性。
select * from Table2 right join Table1 on Table1.id = Table2.id
在第一个查询中,右连接将右侧表 table1 与左侧表 table2 进行比较。
其中将显示 table1 的所有属性,而在 table2 中仅显示条件为真的那些属性。
两个查询将给出相同的结果,因为查询中表声明的顺序不同,例如您在第一个左连接查询中分别在左和右声明 table1 和 table2,并且在第二个右连接中分别在右和左声明 table1 和 table2询问。
这就是您在两个查询中得到相同结果的原因。因此,如果您想要不同的结果,请分别执行这两个查询,
select * from Table1 left join Table2 on Table1.id = Table2.id
select * from Table1 right join Table2 on Table1.id = Table2.id
Select * from Table1 t1 Left Join Table2 t2 on t1.id=t2.id
根据定义:Left Join 选择表 1 中使用“select”关键字提及的所有列以及表 2 中与“on”关键字之后的条件匹配的列。
同样,根据定义:Right Join 选择表 2 中使用“select”关键字提及的所有列以及表 1 中与“on”关键字之后的条件匹配的列。
参考您的问题,将两个表中的 id 与需要在输出中抛出的所有列进行比较。因此,id 1 和 2 在两个表中都很常见,因此结果中您将有四列,其中依次来自第一个和第二个表的 id 和 name 列。
*select * from Table1 left join Table2 on Table1.id = Table2.id
上面的表达式,它从表 1 和列中获取所有记录(行),并从表 2 中获取表 1 和表 2 中匹配的 id。
select * from Table2 right join Table1 on Table1.id = Table2.id**
与上面的表达式类似,它从表 1 和列中获取所有记录(行),并从表 2 中获取表 1 和表 2 中的匹配 id。(请记住,这是一个右连接,所以表 2 中的所有列而不是从表 1 将被考虑)。
LEFT JOIN
就可以达到任何预期的结果,为什么还需要RIGHT JOIN
? :PSelect * from Table1 left join Table 2
将返回表 1 的所有记录加上表 2 的重合记录。相反的Select * from Table1 right join Table 2
将返回表 2 中的所有记录和表 1 的重合记录。希望对您有所帮助。SELECT * FROM Table1 LEFT JOIN Table2
和SELECT * FROM Table2 LEFT JOIN Table1