2013-08-06 57 views
1

我有這個SQL語句的麻煩:SQL INNER JOIN不看錶的別名

SELECT linkstable.date, (linkstable.count - x.count) 
FROM (SELECT .....) AS linkstable 
INNER JOIN linkstable AS x 
    ON linkstable.date = x.date+1 

它告訴我一個鏈接表不能,儘管(SQL錯誤1146)發現有顯然是一個別名到選擇查詢。有誰可以告訴我,我該如何繞過這個錯誤?

+1

你們是不是要加入你的子查詢到自己?你使用的是哪個數據庫? – Taryn

+0

你正在使用什麼類型的SQL? – msmucker0527

+2

[該錯誤消息似乎表明MySQL](http://stackoverflow.com/questions/tagged/mysql-error-1146)。 –

回答

5

您不能別名別名。如果你想加入表本身,重複選擇:

SELECT linkstable.date, (linkstable.count - x.count) 
FROM (SELECT .....) AS linkstable 
INNER JOIN (SELECT .....) AS x ON linkstable.date = x.date+1 

如果內部的選擇太麻煩了,或者你正在運行性能問題插入其結果到一個臨時表,並在主查詢中使用它。

+0

我給你的鏈接很糟糕。這是[SQL Server 2008](http://sqlfiddle.com/#!3/1fa93/8639)和[Oracle](http://sqlfiddle.com/#!4/ee7da/6937) –

+0

@ConradFrix這些假設linkstable是一個表,而不僅僅是一個別名? – msmucker0527

+2

@ msmucker0527你是對的。 OP需要清除那個。當然OP還應該清除RDBMS。例如,如果這是SQL 2008和我的假設是錯誤的,那麼我會使用公用表表達式而不是臨時表或表變量。但是,如果是MySQL,Yuriy是正確的。 –

3

您不能像FROM子句中那樣引用子查詢的別名。但是,如果你的數據庫支持通用表表達式,你可以使用WITH子句來完成同樣的事情:

WITH linkstable as (SELECT ...) 
SELECT linkstable.date, (linkstable.count - x.count) 
FROM linkstable 
INNER JOIN linkstable AS x 
    ON linkstable.date = x.date+1