Previous Topic

Next Topic

Corrected LEFT OUTER JOIN Optimization when Used as a Predicate Clause

A particular query was found which did not return a correct result set when a LEFT OUTER JOIN was specified as the predicate:

SELECT p.*, ip.STUDENT_ID, ip.IS_NULL, ip.STRING_VAL, ip.NUMBER_VAL, ip.TIME_VAL, v.VAL_NAME, v.SEQ_NUM AS VAL_SEQ_NUM, cp.IS_REQUIRED
FROM CT_CLASS_PROP cp
INNER JOIN CT_PROP p ON p.PROP_ID = cp.PROP_ID
LEFT OUTER JOIN CT_INSTANCE_PROP ip ON p.PROP_ID = ip.PROP_ID 
AND STUDENT_ID = '12345'
LEFT OUTER JOIN CT_PROP_VAL v ON v.prop_val_id = ip.STRING_VAL 
AND p.PROP_TYPE = 5
WHERE CLASS_ID = '67890'
	ORDER BY CLASS_ID, cp.SEQ_NUM;

The query returned 0 rows while the correct result should have been 1 row. The query optimizer had moved a predicate clause from the last LEFT OUTER JOIN to the INNER JOIN, inappropriate when the predicates are part of a LEFT OUTER JOIN condition. Logic to check this LEFT OUTER JOIN predicate condition has been added resulting in a proper query return.