2009-03-31 5 views
0

После 5.0.12 MySQL изменил синтаксис левых объединений в соответствии со стандартом SQL2003. ТакMySQL LEFT JOIN после изменений 5.0.12 - Как переписать запрос

... FROM t1 , t2 LEFT JOIN t3 ON (expr) 

потребности быть переписано как

... FROM (t1 , t2) LEFT JOIN t3 ON (expr 

или иначе это будет разобрано как ... FROM t1 , (t2 LEFT JOIN t3 ON (expr))

Теперь у меня есть древнее приложение, которое я уверен, портирование из MySQL 3.23 (ЕЕК!) до 5,1, а у старого кода есть этот запрос:

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 

Ошибка этого с ошибкой 1054, неизвестной столбец в b.chrggrade. Это связано с тем, что он разобран как

выберите b. , c., г. *, P.perfname, p.persname от бронирований б, (клиент с оставил присоединиться к классу г на b.chrggrade = g.grcode) оставили присоединиться к лицу р на b.person = p.percode где complete = 'Y' и invoiced = 'N' и датамады между '2009-03-25' и '2009-03-31' и c.custcode = b.cust order by cust, person, tsref, stdt

думаю.

Я уверен, что правильно поставленные скобки могут исправить это, но я в тупике. Я нашел ссылку на это изменение на http://bugs.mysql.com/bug.php?id=13551, в котором показано, как исправить простое левое соединение, но я до сих пор не могу его обработать для этого запроса. David

ответ

4

Прекратить использование синтаксиса запятой в целом и быть явным в ваших операторах JOIN. Синтаксис запятой заставляет вас поставить условие JOIN в предложение WHERE, которое может не выполняться до тех пор, пока LEFT/RIGHT не присоединяется, в зависимости от того, как он разбирается. Использование явного JOINS делает запрос более читаемым в любом случае.

... FROM t1, t2 t3 LEFT JOIN ON (выражение) становится ... FROM t1 INNER JOIN t2 ON (выражение) LEFT JOIN t3 ON (выражение)

Это также будет исправить ошибку вы видите. Если в таблице заказов нет chrggrade, ничего не исправит ошибку.