Mysql 无法在4表查询中显示所有结果
我有零件表和价格表 零件表本身与保修零件号相关 我想运行一个查询以显示所有零件,如果它们有保修,则显示保修的零件号,然后显示价格Mysql 无法在4表查询中显示所有结果,mysql,sql,alias,Mysql,Sql,Alias,我有零件表和价格表 零件表本身与保修零件号相关 我想运行一个查询以显示所有零件,如果它们有保修,则显示保修的零件号,然后显示价格 select `P`.`partNumber` AS `partNumber`,`P`.`Description` AS `Description`,`PP`.`Price` AS `Price`,`P`.`WarrantyPartNumber` AS `WarrantyPartNumber`,`W`.`Description` AS `WDescription` f
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
预期结果
有或无保修的所有零件均显示任何保修的成本
元素(如果存在)
这是您的查询,修复为至少可读:
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
- left join
,因为以前的wpp
可能没有找到匹配的行left join
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
- left join
,因为以前的wpp
可能没有找到匹配的行left join