无法在 4 table 查询中显示所有结果
Cant Get All results to show on a 4 table query
我有零件 table 和价格 table
部件 table 引用自身与保修部件号相关。
我想 运行 查询以显示所有部件,如果他们有保修,请提供保修的部件号和价格。
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
预期结果
All parts with or without warranty showing cost of any warranty
elements if present.
这是您的查询,已修改为至少可读:
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
inner join pp
因为这些应该匹配。您期望每个零件的价格。
- left join
w
因为可能没有保修部分
- left join
wpp
因为之前的left join
可能没有找到匹配的行。
我有零件 table 和价格 table 部件 table 引用自身与保修部件号相关。
我想 运行 查询以显示所有部件,如果他们有保修,请提供保修的部件号和价格。
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
预期结果
All parts with or without warranty showing cost of any warranty elements if present.
这是您的查询,已修改为至少可读:
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
inner joinpp
因为这些应该匹配。您期望每个零件的价格。- left join
w
因为可能没有保修部分 - left join
wpp
因为之前的left join
可能没有找到匹配的行。