Это ваш запрос, который по крайней мере может быть читаемым:
select p.partNumber, p.Description, pp.Price,
pp.WarrantyPartNumber,
w.Description AS WDescription, wPP.Price AS wPrice
from tblPart p left outer join
tblPart w
on p.WarrantyPartNumber = w.partNumber inner join
tblPartPrice pp
on p.partNumber = pp.partNumber right outer join
tblPartPrice wPP
on w.partNumber = wPP.partNumber
where PP.tierID = 0 AND wPP.tierID = 0;
Смешивание левого и правого объединений с предложением where
очень сложно.Ваш запрос кажется, что можно использовать что-то более простое.
Если я правильно понимаю, уровни для гарантийных частей должны быть одинаковыми.Следовательно, это условие должно быть в предложении on
:
select p.partNumber, p.Description, pp.Price,
pp.WarrantyPartNumber,
w.Description AS WDescription, wPP.Price AS wPrice
from tblPart p join
tblPartPrice pp
on p.partNumber = pp.partNumber left outer join
tblPart w
on p.WarrantyPartNumber = w.partNumber left join
tblPartPrice wpp
on w.partNumber = wpp.partNumber and
wpp.tierID = pp.TierId
where pp.tierID = 0;
Обратите внимание на join
s:
p
внутреннее соединение pp
потому что они должны совпадать.Вы ожидаете цену для каждой части. - левое соединение
w
, потому что может не быть гарантийной части - левое соединение
wpp
потому что предыдущий left join
мог не найти подходящую строку.