如手册中所述:
以前,逗号运算符(
,)和JOIN都具有相同的优先级,因此join表达式t1, t2 JOIN t3被解释为((t1, t2) JOINt3)。现在JOIN具有更高的优先级,因此该表达式被解释为(t1, (t2 JOINt3))。此更改会影响使用ON子句的语句,因为该子句只能引用联接操作数中的列,并且优先级的更改会更改对这些操作数的解释。例子:
CREATE TABLE t1 (i1 INT, j1 INT);CREATE TABLE t2 (i2 INT, j2 INT);CREATE TABLE t3 (i3 INT, j3 INT);INSERT INTO t1 VALUES(1,1);INSERT INTO t2 VALUES(1,1);INSERT INTO t3 VALUES(1,1);SELECt * FROM t1, t2 JOIN t3 ON (t1.i1 = t3.i3);以前,
SELECt由于t1,t2as的隐式分组,所以合法(t1,t2)。现在JOIN优先,所以ON子句的操作数是t2和t3。因为t1.i1这两个操作数都不是列,所以结果是Unknowncolumn 't1.i1' in 'onclause'错误。要允许处理连接,请使用括号将前两个表显式分组,以便该ON子句的操作数为(t1,t2)和t3:SELECT * FROM (t1, t2) JOIN t3 ON (t1.i1 = t3.i3);另外,请避免使用逗号运算符,而应使用
JOIN:SELECt * FROM t1 JOIN t2 JOIN t3 ON (t1.i1 = t3.i3);这种变化也适用于与混合逗号操作语句
INNER JOIN,CROSS JOIN,LEFT JOIN,并且RIGHTJOIN,所有这些现在已经比逗号运算符优先级越高。



