2013-12-13 95 views
0

我试图运行这个连接,但我没有收到正确的值。SQL连接结果错误

我的第一个查询返回像25000的记录

SELECT count(*) from table1 as DSO, 
table2 as EAR 
WHERE 
(UCASE(TRIM(EAR.value)) = UCASE(TRIM(DSO.value)) 
AND 
UCASE(TRIM(EAR.value1) = UCASE(TRIM(DSO.value1)) 

我的第二个查询返回喜欢3000000

SELECT count(*) from table1 as DSO 
left join table2 as EAR, 
ON 
(UCASE(TRIM(EAR.value)) = UCASE(TRIM(DSO.value)) 
AND 
UCASE(TRIM(EAR.value1) = UCASE(TRIM(DSO.value1)) 

总的表1的记录是像45,000这就是我应该收到。

+0

对于table1中的部分或全部记录,您可能在table2中有多个匹配项。它将返回每个案例的记录,以及没有匹配的每个案例的记录。 – beercodebeer

+0

WHERE EAR.value IS NOT NULL – Kashif

+0

与'WHERE'子句连接的多个与'INNER JOIN'相同,通常缩写为JOIN。 'LEFT JOIN'将会有不同的结果,因为它也显示'DSO'中的所有记录,而'EAR'中没有匹配。 – Aquillo

回答

0

第一个查询是一个INNER JOIN,第二个查询是一个LEFT JOIN。你应该期待完全不同的结果。另外,请看db2400使用UCASE和TRIM函数处理NULL的方式。我的猜测是你的左连接正在进行一些你不想要的比赛。

第一个查询中的INNER JOIN将从table1中排除table2中没有匹配的任何记录。这很快解释了更低的计数。

如果在table2中发现多个匹配项,那么任何连接都将愉快地为table1中的每条记录创建多个行。不同之处在于,LEFT JOIN也将为table1中的每个记录创建一行,这在table2中没有匹配。这听起来像你期望在两张桌子之间有1:1的比赛,但这不是你所得到的。