Mysql
 sql >> Base de données >  >> RDS >> Mysql

Migration de requêtes Firebird vers MySQL - Sélectionnez la sous-requête de jointure interne

Le problème est que dans mySQL l'l'opérateur virgule a une priorité inférieure que le join opérateur, donc la jointure interne product inner join (subquery) on part.id = highestcost.partid inner join (subquery) on part.id = lowestcost.partid les jointures sont évaluées avant la part table est jointe dans l'expression, d'où le message d'erreur.

Remplacez les opérateurs virgule par un simple join opérateurs et déplacez les conditions de jointure de where clause à on clauses et tout ira bien :

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

Si vous avez plusieurs requêtes de ce type où vous mélangez l'opérateur virgule et les jointures explicites, vous devriez les vérifier car elles peuvent produire des résultats différents même s'il n'y a pas eu d'erreur de syntaxe dans MySQL.