这出现在工作中,这真的只是一个难题......
查询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
;
第一个查询有什么问题?
答案 0 :(得分: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%' ;
当您将条件放在用于过滤连接记录的左连接中时,但由于是左连接,它将返回表A中的所有记录,因为您没有对其进行任何条件。
现在,如果条件在表B上,它将会有所不同。它属于左连接(除非它类似于B.id为null)或者您将查询返回到内连接。
答案 1 :(得分:2)
您是否尝试将“Like”-part移动到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%'
;