Mysql
 sql >> Database >  >> RDS >> Mysql

Migrazione di query da Firebird a MySQL - Seleziona Inner Join Subquery

Il problema è che in MySQL l'operatore comma ha una precedenza inferiore rispetto a join operatore, quindi il product inner join (subquery) on part.id = highestcost.partid inner join (subquery) on part.id = lowestcost.partid i join vengono valutati prima la part table è unito nell'espressione, da cui il messaggio di errore.

Sostituisci gli operatori con virgola con il semplice join operatori e sposta le condizioni di unione da where clausola su on clausole e tutto andrà bene:

...
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 

Se hai più query di questo tipo in cui mescoli operatore virgola e join espliciti, dovresti controllarle perché potrebbero produrre risultati diversi anche se non si è verificato un errore di sintassi in MySQL.