MySQL 5.0.12 LEFT JOIN después de cambios - ¿Cómo volver a escribir la consulta
-
22-08-2019 - |
Pregunta
Después de MySQL 5.0.12 cambiado la sintaxis de izquierda se une para que coincida con estándar SQL2003. Así
... FROM t1 , t2 LEFT JOIN t3 ON (expr)
necesita ser reescrito como
... FROM (t1 , t2) LEFT JOIN t3 ON (expr
o de lo contrario será analizado como ... FROM t1 , (t2 LEFT JOIN t3 ON (expr))
Ahora, tengo una antigua aplicación que estoy portar desde la versión 3.23 (eek!) A 5,1, y el código de edad tiene esta consulta:
select b.*, c.*, g.*, p.perfname, p.persname
from bookings b, customer c
left join grade g on b.chrggrade=g.grcode
left join person p on b.person=p.percode
where complete='Y' and invoiced='N'
and datemade between '2009-03-25' and '2009-03-31'
and c.custcode=b.cust
order by cust, person, tsref, stdt
Esta falla con el error SQL 1054, la columna desconocido en b.chrggrade. Esto se debe a que es el análisis como
seleccione b. , c. , g. *, P.perfname, p.persname de reservas b, (c cliente izquierdo unirse grado g en b.chrggrade = g.grcode) la izquierda se unen en persona p = b.person p.percode donde = completas 'Y' y facturado = 'N' y entre datemade '2009-03-25' y '2009-03-31' y c.custcode = b.cust ordenado por cust, persona, TSref, STDT
Creo.
Estoy seguro de soportes colocados correctamente puede solucionar esto, pero estoy perplejo. Me encontré con referencia a este cambio en la dirección http://bugs.mysql.com/bug.php ? id = 13551 , que muestra cómo solucionar un simple izquierda se unen, pero todavía no puedo trabajar hacia fuera para esta consulta. David
Solución
Deje de usar la sintaxis de coma por completo y ser explícitos en sus estados de unirse. La coma de sintaxis le obliga a poner la condición de combinación en la cláusula WHERE, que no pueden quedar ejecutada hasta después de IZQUIERDA / DERECHA se une, dependiendo de cómo se analiza. El uso explícito UNE A hace que la consulta sea más legible de todos modos.
... FROM t1, t2 t3 LEFT JOIN ON (expr) se convierte ... FROM t1 t2 EN INNER JOIN (expr) LEFT JOIN t3 ON (expr)
Eso también corregir el error que está viendo. A menos que no hay chrggrade en la tabla de reservas, entonces nada va a corregir el error.