我正在查看以下链接Left Join
如果左连接使用表1中的所有元素并且不关心表2,为什么不写:
SELECT table1.column_name(s)
FROM table1
而不是写
SELECT table1.column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.column_name=table2.column_name;
答案 0 :(得分:3)
并非人们关注TABLE1
中的价值观,而且正如您所写,并不关心TABLE2
。我们关注TABLE1
中的值以及TABLE2
中的值(如果它们存在)。
假设您想要一份员工及其经理的报告。你不想仅仅因为他没有经理而排除你公司的总裁。因此,您可以将其写为LEFT OUTER JOIN
。
SELECT e.employee_name, m.employee_name manager_name
FROM employees e
LEFT JOIN employees m ON m.employee_id = e.manager_id
这样,您将获得总统的名字和总统的NULL
经理名称。如果你把它写成INNER加入,那么你根本就没有为总统写过一行。
答案 1 :(得分:2)
"如果左连接使用表1中的所有元素,并且不关心表2"
此语句错误,示例SQL甚至不相似。
LEFT JOIN意味着: 来自" LEFT"的所有行表,无论是否匹配" RIGHT"是否和" RIGHT"中的所有行哪里有比赛。例如,想想客户及其订单。您可能有100个客户,而不是所有客户都有订单。
select *
from Customers c
LEFT JOIN Orders o on c.CustomerID = o.CustomerID;
将检索所有这100个Customer行,其中那些没有订单的行对于Orders'如果列中有N个订单,则会为每个订单重复其客户行。即:
客户:(CustomerId,客户名称)
1, Customer1
2, Customer2
3, Customer3
订单:(的OrderId,客户ID,订购日期,...)
1, 1, 2000/1/1 10:00:00, ...
2, 1, 2000/1/5 11:00:00, ...
3, 2, 2000/1/6 18:00:00, ...
结果将是:
1, Customer1, 1, 1, 2000/1/1 10:00:00, ...
1, Customer1, 2, 1, 2000/1/5 11:00:00, ...
2, Customer2, 3, 2, 2000/1/6 18:00:00, ...
3, Customer3, NULL, NULL, NULL, ...
正如您所看到的,它并没有选择"元素"只有来自LEFT表,它确实来自两者。您可以从任一表中指定单个或所有列:
select c.CustomerID, c.CustomerName, o.OrderDate, o.OrderID
from Customers c
LEFT JOIN Orders o on c.CustomerID = o.CustomerID;
select c.*
from Customers c
LEFT JOIN Orders o on c.CustomerID = o.CustomerID;
select c.*, o.OrderId, o.OrderDate
from Customers c
LEFT JOIN Orders o on c.CustomerID = o.CustomerID;
等
答案 2 :(得分:2)
当只需要第一个表中的列时,没有WHERE子句的另一个表上的LEFT JOIN确实非常不合适。
事实上,它可能会返回比预期更多的行。
例如:
首先是一些样本数据:
表1:
Id Text1 SomeKey
1 Tralala 10
2 Joehoe 20
3 Trololo 30
表2:
Id SomeKey Text2
1 10 Blah
2 20 Bleh
3 20 Blergh
仅在Table1上的查询将返回3行。
但在SomeKey上使用左连接的查询将返回4行:
select t1.Text1
from Table1 t1
left join Table2 t2 on (t1.SomeKey = t2.SomeKey)
返回:
Text1
-------
Tralala
Joehoe
Joehoe
Trololo
在没有从连接表中选择字段的情况下,人们进行这种左连接的一个常见原因是在Table1中找到Table2中没有匹配项的记录。或者使用基于Table2字段的标准。
select t1.Text1, t1.SomeKey
from Table1 t1
left join Table2 t2 on (t1.SomeKey = t2.SomeKey)
where t2.Id is null;
返回:
Text1 SomeKey
-------- -------
Trololo 30