MySQL 5.0.12 LEFT JOIN dopo le modifiche - Come riscrivere interrogazione
-
22-08-2019 - |
Domanda
Dopo 5.0.12 MySQL cambiato la sintassi per sinistra si unisce per abbinare standard di SQL2003. Quindi
... FROM t1 , t2 LEFT JOIN t3 ON (expr)
ha bisogno di essere riscritta come
... FROM (t1 , t2) LEFT JOIN t3 ON (expr
altrimenti verrà analizzato come ... FROM t1 , (t2 LEFT JOIN t3 ON (expr))
Ora, ho un antico app sto porting da MySQL 3.23 (EEK!) A 5.1, e il vecchio codice è questa query:
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
Questo non riesce con l'errore di SQL 1054, sconosciuta colonna b.chrggrade. Questo è perché è l'analisi come
selezionare b. , c. , g. *, P.perfname, p.persname dalle prenotazioni b, (c cliente LEFT JOIN grado G su b.chrggrade = g.grcode) LEFT JOIN persona p su b.person = p.percode dove = completi 'Y' e fatturata = 'N' e datemade tra '2009-03-25' e '2009-03-31' e c.custcode = b.cust ORDER BY Cust, persona, TSref, STDT
Credo.
Sono sicuro staffe poste correttamente possono risolvere questo problema, ma io sono perplesso. Ho trovato riferimento a questo cambiamento a http://bugs.mysql.com/bug.php ? id = 13551 , che mostra come risolvere un semplice sinistra unirsi, ma non riesco ancora a lavorare fuori per questa query. David
Soluzione
Smettere di usare la sintassi del tutto e virgola essere esplicito nelle istruzioni JOIN. Le forze di sintassi virgola di mettere la condizione di join nella clausola WHERE, che non può ottenere attuare dopo sinistra / destra si unisce, a seconda di come viene analizzato. Utilizzando esplicito ENTRA rende la query più leggibile in ogni caso.
... FROM t1, t2 t3 LEFT JOIN ON (espressione) diventa ... da T1 INNER JOIN t2 ON (espressione) LEFT JOIN t3 ON (espressione)
Questo sarà anche correggere l'errore che state vedendo. A meno che non v'è alcun chrggrade nella tabella prenotazioni, allora nulla sarà correggere l'errore.