MySQL的左后5.0.12变化JOIN - 如何重写查询
-
22-08-2019 - |
题
5.0.12后的MySQL改变的语法的左侧连接,以匹配标准SQL2003。所以
... 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
此失败,SQL错误1054,在b.chrggrade未知柱。这是因为它的解析作为
选择湾角,克。*,p.perfname,p.persname 从预订B,(客户C 留在b.chrggrade加入级G = g.grcode) 左加入的人员P上b.person = p.percode 其中完整=“Y”和发票=“N” 和“2009-03-25”之间datemade“2009-03-31” 和c.custcode = b.cust 为了通过卡斯特,人,TSef文档,STDT
我想。
我敢肯定,正确放置支架可以解决这个问题,但我难倒。 我发现在 http://bugs.mysql.com/bug.php参考这一变化?ID = 13551 ,它展示了如何解决一个简单的左加入,但我仍然不能工作了此查询。 大卫
解决方案
完全停止使用逗号语法和在你的JOIN声明明确。逗号语法迫使你把JOIN条件的WHERE子句,它可能不会直到后左/右连接,这取决于它是如何解析的执行英寸使用显式JOINS使得查询反正更具有可读性。
... FROM T1,T2 LEFT JOIN T3 ON(表达式) 变 ... FROM T1 INNER JOIN T2 ON(表达式)LEFT JOIN T3 ON(表达式)
这也将解决你所看到的错误。除非有在预约表中没有chrggrade,则事修复错误。
不隶属于 StackOverflow