Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Migração de consultas Firebird para MySQL - Selecione a subconsulta de junção interna


O problema é que no mySQL o operador de vírgula tem menor precedência do que join operador, portanto, a product inner join (subquery) on part.id = highestcost.partid inner join (subquery) on part.id = lowestcost.partid as junções são avaliadas antes a part tabela é unida na expressão, daí a mensagem de erro.

Substitua os operadores de vírgula por join simples operadores e mova as condições de junção de where cláusula para on cláusulas e tudo ficará bem:
...
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 você tiver mais consultas desse tipo onde você mistura operador de vírgula e junções explícitas, verifique-as porque elas podem produzir resultados diferentes, mesmo que não haja erro de sintaxe no MySQL.