Сначала кажется, что вы должны поставить
AND tbl2.col2 = 'zyx' and tbl2.col3 = 'abc'
в предложении WHERE, однако это будет противоречить OUTER JOIN. WHERE ограничивает результаты, поэтому добавление, которое фактически делает его внутренним объединением. Это можно сделать несколькими способами:
Добавить нули в где
Select * FROM tbl1
LEFT OUTER JOIN tbl2 ON tbl1.id = tbl2.id
WHERE tbl1.col1 = 'pqr'
AND ((tbl2.col2 = 'zyx' AND tbl2.col3 = 'abc')
OR (tbl2.col2 = NULL AND tbl2.col3 = NULL))
или используйте подзапрос
SELECT * FROM tbl1
LEFT OUTER JOIN
(
SELECT *
FROM tbl2
WHERE tbl2.col2 = 'zyx' and tbl2.col3 = 'abc'
) AS temp2 ON tbl1.id = temp2.id
WHERE tbl1.col1 = 'pqr'
Я бы, вероятно, выбрал подход подзапроса, так как он просто яснее, что вы намереваетесь. Что касается производительности, любой столбец в WHERE обычно должен быть покрыт индексом. Кроме того, оптимизатор должен быть в состоянии найти лучший подход, независимо от того, каким образом вы пишете запрос.