我是否理解了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的工作原理?
答案 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_ID=3
的行将显示一次,NULL
的值为B_ID
,因为表B中没有与之匹配的行。A_ID=2
的5行根本不会显示,因为它们与表A中的任何行都不匹配。A_ID=1
的5行将显示所有,每个行与表A中包含A_ID=1
的1行合作。即使表A中只有2行,你也可以得到6个结果。