MySQL Left Join比单独的“左”表更大?

时间:2017-03-06 21:30:59

标签: mysql

我是否理解了Left Join应该做什么?

我有一个查询。称之为查询A.它返回19条记录。

我有另一个查询,查询B.它返回1,400条记录。

我将查询B作为左连接插入到查询A中,因此查询A变为:

SELECT *
FROM tableA
LEFT JOIN (<<entire SQL of Query B>>) ON tableA.id = tableB.id

现在,左连接表示表A中的所有内容,只表示表B中匹配的记录。所以无论如何,这个混合查询不应该返回超过原始查询A返回的19条记录。我实际得到的是1,000条记录。

我是否从根本上误解了LEFT JOIN的工作原理?

2 个答案:

答案 0 :(得分:3)

你并没有完全误解LEFT JOIN,而是它所隐含的结果。如果A中只有一行,B中有1000行,则引用A中该单行的id;你的结果将是1000行。 你忽略了关系可能是1对多。“左”表/子查询的大小(受WHERE条件限制)是下限< / strong>表示结果数量。

答案 1 :(得分:3)

是的,你有点误解。

  

现在,左连接表示表A中的所有内容,只表示表B中匹配的记录。

到目前为止,非常好:表B中的数据只有在根据您在ON子句中指定的规则与表A匹配时才会被包含。

  

所以无论如何,这个混合查询不应该返回超过原始查询A返回的19条记录。

这似乎有道理,直到你意识到表B中的多行与表A中的同一行相符。

假设您在表A中有两行,一行有A_ID=1,另一行有A_ID=3;表B中有10行;表B中的5行具有A_ID=1,5具有A_ID=2。表B中的所有行都具有B_ID的不同值。

如果你使用左边连接的条件A_ID必须匹配,你会得到哪些行?

  • 表A中包含A_ID=3的行将显示一次,NULL的值为B_ID,因为表B中没有与之匹配的行。
  • 表B中包含A_ID=2的5行根本不会显示,因为它们与表A中的任何行都不匹配。
  • 表B中包含A_ID=1的5行将显示所有,每个行与表A中包含A_ID=1的1行合作。

即使表A中只有2行,你也可以得到6个结果。