Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Abfragemigration von Firebird zu MySQL – Wählen Sie Unterabfrage für innere Verknüpfung aus

Das Problem ist, dass in mySQL der Komma-Operator eine niedrigere Priorität als join -Operator, daher der product inner join (subquery) on part.id = highestcost.partid inner join (subquery) on part.id = lowestcost.partid Joins werden vorher ausgewertet der part Tabelle wird in den Ausdruck eingebunden, daher die Fehlermeldung.

Ersetzen Sie die Kommaoperatoren durch einfaches join Operatoren und verschieben Sie die Join-Bedingungen aus dem where -Klausel zu on Klauseln und alles wird gut:

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

Wenn Sie mehr solche Abfragen haben, bei denen Sie Kommaoperatoren und explizite Verknüpfungen mischen, sollten Sie sie überprüfen, da sie möglicherweise andere Ergebnisse liefern, selbst wenn in MySQL kein Syntaxfehler aufgetreten ist.