2013-07-28 25 views
2

這裏後隱含聲明是一個怪胎,我無法解釋:FROM子句原因設置可變JOIN錯誤,如果表

FROM (
    SELECT @report_date := 
    IF (DAYOFWEEK(CURDATE()) BETWEEN 3 AND 7, DATE_SUB(CURDATE(), INTERVAL 1 DAY), 
     IF (DAYOFWEEK(CURDATE()) = 1, DATE_SUB(CURDATE(), INTERVAL 2 DAY), 
     IF (DAYOFWEEK(CURDATE()) = 2, DATE_SUB(CURDATE(), INTERVAL 3 DAY), NULL))) 
) AS dt 
, t1 
LEFT JOIN t2 ON t1.id = t2.id 

http://sqlfiddle.com/#!2/9e0c4/3

作品。

FROM t1 
, (
    SELECT @report_date := 
    IF (DAYOFWEEK(CURDATE()) BETWEEN 3 AND 7, DATE_SUB(CURDATE(), INTERVAL 1 DAY), 
     IF (DAYOFWEEK(CURDATE()) = 1, DATE_SUB(CURDATE(), INTERVAL 2 DAY), 
     IF (DAYOFWEEK(CURDATE()) = 2, DATE_SUB(CURDATE(), INTERVAL 3 DAY), NULL))) 
) AS dt 
LEFT JOIN t2 ON t1.id = t2.id 

http://sqlfiddle.com/#!2/9e0c4/2

不行的,錯誤:

Unknown column 't1.id' in 'on clause': ... 

爲什麼?請注意在FROM條款中聲明t1的順序。


注意,我沒有必要尋找替代品,我只是想知道爲什麼這裏的秩序造成一個JOIN到錯誤時FROM條款完成,我會想到下面會發生

如果有人對我如何在這裏結束感興趣,請參閱this broken fiddlethis working fiddle以獲得真實查詢的基本示例。

+0

請注意,一個非常類似的問題:http://stackoverflow.com/a/761599/451969 –

回答

3

這是因爲你在混合ANSINON-ANSI加入。不要使用comma,而應使用CROSS JOIN替換它。

的問題是優先級,而JOIN的優先級高於隱,

Previously, the comma operator (,) and JOIN both had the same precedence, so the join expression t1, t2 JOIN t3 was interpreted as ((t1, t2) JOIN t3) . Now JOIN has higher precedence, so the expression is interpreted as (t1, (t2 JOIN t3)) . This change affects statements that use an ON clause, because that clause can refer only to columns in the operands of the join, and the change in precedence changes interpretation of what those operands are.

http://dev.mysql.com/doc/refman/5.0/en/join.html

使用CROSS JOIN更換隱含JOIN

FROM t1 
CROSS JOIN (
    SELECT @report_date := 
    IF (DAYOFWEEK(CURDATE()) BETWEEN 3 AND 7, DATE_SUB(CURDATE(), INTERVAL 1 DAY), 
     IF (DAYOFWEEK(CURDATE()) = 1, DATE_SUB(CURDATE(), INTERVAL 2 DAY), 
     IF (DAYOFWEEK(CURDATE()) = 2, DATE_SUB(CURDATE(), INTERVAL 3 DAY), NULL))) 
) AS dt 
LEFT JOIN t2 ON t1.id = t2.id 

http://sqlfiddle.com/#!2/9e0c4/21

+0

這解決了我的根本問題(謝謝你),但第一句話在實踐中意味着什麼?如果我翻轉它們,爲什麼它會起作用,所以後者呢?我只是不明白爲什麼這會導致一個錯誤......如果可能的話,隨意混淆我的細節。 –

+0

'1.' [ANSI與非ANSI SQL JOIN語法](http://stackoverflow.com/questions/1599050/ansi-vs-non-ansi-sql-join-syntax)'2。 ON狀態的範圍僅限於逗號內。當你翻轉它時,它不會因爲你沒有在'dt'上指定任何條件而中斷。當你定義這樣一個條件時,它會中斷:[Click Here。](http://sqlfiddle.com/#!2/9e0c4/30) –

+1

好的,這是有道理的(以及[Bill Karwin的答案在這裏])( http://stackoverflow.com/a/761599/451969),我剛剛出土)。如果您可以將該解釋編輯爲答案,我會接受它。 –

0

,你也可以使用這個沒有左連接。有獨立的用逗號

所有表

- fiddle here

編輯:

要麼只使用連接或僅使用逗號分隔表,但不混合。

+0

我對刪除'JOIN'(在實際代碼的情況下是'JOIN')不感興趣。這也不能解釋爲什麼它會崩潰。 –

+0

由於它在逗號分隔的表格之間以逗號混合並使用連接 –

相關問題