Problem polega na tym, że w mySQL operator przecinka ma niższy priorytet niż join
operatora, dlatego product inner join (subquery) on part.id = highestcost.partid inner join (subquery) on part.id = lowestcost.partid
połączenia są oceniane przed part
tabela jest połączona w wyrażeniu, stąd komunikat o błędzie.
Zastąp operatory przecinkami prostymi join
operatorów i przenieś warunki łączenia z where
klauzula on
klauzule i wszystko będzie dobrze:
...
FROM vendor
inner join vendorparts on vendor.id = vendorparts.vendorid
inner join part on vendorparts.partid = part.id
inner join product on product.partid = part.id
INNER JOIN (SELECT vendorparts.partid,
Max(vendorparts.lastcost) AS Highestcost
FROM vendorparts
GROUP BY vendorparts.partid) AS highestcost
ON part.id = highestcost.partid
INNER JOIN (SELECT vendorparts.partid,
Min(vendorparts.lastcost) AS Lowestcost
FROM vendorparts
GROUP BY vendorparts.partid) AS lowestcost
ON part.id = lowestcost.partid
WHERE vendorparts.lastcost <> 0
Jeśli masz więcej takich zapytań, w których mieszasz operator przecinka i jawne złączenia, powinieneś je sprawdzić, ponieważ mogą dawać różne wyniki, nawet jeśli w MySQL nie wystąpił błąd składni.