2017-02-27 48 views
0

如果取消註釋LEFT JOIN,爲什麼會出現此錯誤?運行總計中on子句中的未知列

#1054 - Unknown column 's.id' in 'on clause' 

s.id多次使用查詢

SELECT s.id 
    , s.qty 
    , s.price_cost 
    , @running_total:[email protected] running_total 
    , @total:[email protected]+s.qty-s.qtyoff total 
    FROM stock s 
    , (SELECT @running_total:=0, @total:=0) vars 
/*LEFT JOIN stockoff o ON o.stockoff_id=s.id*/ 
WHERE s.block_id = 5659 
    AND s.type = 2 
    AND s.is_booked = 1 
    AND s.product_id = 18110 
    AND s.time <= 1514678400 
GROUP 
    BY s.id 
HAVING running_total <= 0 
ORDER 
    BY s.time DESC 
    , s.id DESC 
+0

順便說一句,外連接表中沒有任何選擇列的小點 – Strawberry

回答

2

我猜的錯誤被拋出,因爲你是混合老派逗號語法與新的連接操作JOIN關鍵字。

溝這裏的逗號

FROM stock s, (SELECT @running_total:=0, @total:=0) vars 
      ^

並更換了正確的CROSS JOIN

FROM stock s CROSS JOIN (SELECT @running_total:=0, @total:=0) vars 
      ^^^^^^^^^^ 

這只是一種猜測。我從來沒有研究過在單個SELECT中混合兩種不同語法時會發生什麼。但是沒有什麼好的理由來混合它們。 (也許在問題中的錯誤是足夠的理由不是混合它們

舊學校的逗號語法是偉大的向後兼容性,允許遺留SQL繼續運行但新的SQL沒有需要使用它

+0

它可能只是一個猜測,但它是一個正確的JOIN將工作得很好(但CROSS JOIN更清晰) – Strawberry

+1

@Strawberry:正如您正確指出的那樣,'CROSS'關鍵字是完全可選的,並且沒有任何影響.MySQL解析'CROSS JOIN','INNER JOIN'和'JOIN'。在這裏指定'CROSS'關鍵字就是它的服務以提醒(未來的讀者),省略「ON」條款是故意的而不是疏忽。這並不是說可移植性很重要,但我認爲其他數據庫可能需要'CROSS'關鍵字,並且在沒有'ON'子句的情況下爲'JOIN'添加一個錯誤,並且我不喜歡包含一個ON 1 = 1'。 – spencer7593

相關問題