2012-07-20 35 views
0

这想出了在工作,这真的只是看起来像一个谜......为什么这个离开连接似乎没有按预期工作?

查询1:

SELECT * FROM 
SYSIBM.SYSTABLES A LEFT JOIN 
SYSIBM.SYSTABLESPACE B 
ON A.DBNAME = B.DBNAME 
AND A.TSNAME = B.NAME 
AND A.TSNAME LIKE 'HIB%' 
; 

此查询不上HIB%标准,相反的是,它看起来像查询过滤器应该做的。我会认为把这个标准放在JOIN中应该会产生相同的结果。

查询2项按预期工作:

SELECT * FROM 
(SELECT * FROM SYSIBM.SYSTABLES 
WHERE TSNAME LIKE 'HIB%') A 
LEFT JOIN 
SYSIBM.SYSTABLESPACE B 
ON A.DBNAME = B.DBNAME 
AND A.TSNAME = B.NAME 
; 

什么是错的第一个查询?

回答

4

TRY

SELECT * FROM SYSIBM.SYSTABLES A 
LEFT JOIN SYSIBM.SYSTABLESPACE B 
    ON A.DBNAME = B.DBNAME AND A.TSNAME = B.NAME 
WHERE A.TSNAME LIKE 'HIB%' ; 

当你把条件在左侧加入一个用于过滤的加盟记录,但由于是左连接它返回从表格中的所有记录因为你对此没有任何条件。

现在,如果条件在表B上,它就会有所不同。它属于左连接(除非它是像B.id这样的东西),否则你将把查询变回内连接。

+0

因此,如果我正确理解这一点,'LEFT JOIN'将覆盖我想要在'JOIN'中做的任何一种过滤? – avgvstvs 2012-07-20 18:06:28

+0

第二个表上左连接过滤器的ON子句不是第一个。它将返回第一个表中的所有记录,除了那些通过WHERE子句过滤的记录。 – HLGEM 2012-07-20 18:13:22

2

您是否试图将“喜欢” - 部分移至where子句?

SELECT * 
FROM SYSIBM.SYSTABLES A 
LEFT JOIN SYSIBM.SYSTABLESPACE B ON A.DBNAME = B.DBNAME AND A.TSNAME = B.NAME 
WHERE A.TSNAME LIKE 'HIB%' 
; 
相关问题