Не могу получить все результаты, чтобы показать на 4 таблицы запроса - PullRequest
1 голос
/ 04 июля 2019

У меня есть таблица деталей и таблица цен Таблица деталей относится к самой себе и относится к номеру детали гарантии.

Я хочу выполнить запрос, чтобы показать все детали и, если они имеют гарантию, номер детали для гарантии, а затем цену.

select `P`.`partNumber` AS `partNumber`,`P`.`Description` AS `Description`,`PP`.`Price` AS `Price`,`P`.`WarrantyPartNumber` AS `WarrantyPartNumber`,`W`.`Description` AS `WDescription`
from ((`tblPart` `P` left outer join `tblPart` `W` on `P`.`WarrantyPartNumber` = `W`.`partNumber`)  inner join `tblPartPrice` `PP` on `P`.`partNumber` = `PP`.`partNumber`) 
where PP.tierID = 0  

выше дает правильный вывод, но без цены. как только я добавляю ссылку в Гарантийный прайс-лист, я получаю только детали с отображаемой гарантией.

select `P`.`partNumber` AS `partNumber`,`P`.`Description` AS `Description`,`PP`.`Price` AS `Price`,`P`.`WarrantyPartNumber` AS `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

Ожидаемый результат

Все детали с гарантией или без нее с указанием стоимости любой гарантии элементы, если присутствуют.

1 Ответ

0 голосов
/ 04 июля 2019

Это ваш запрос, который по крайней мере может быть читаемым:

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 мог не найти подходящую строку.
...