2015-07-04 48 views
-1

這次我在mysql別名中遇到了。我不知道這到底意味着什麼以及如何解決它。查詢是:派生表必須有它自己的別名

select * from (SELECT distinct * FROM $tableName1 
       where not exists (select NULL from $tableName2 
            where $tableName1.cid=$tableName2.cid) 
       ) 
where location='xyz'; 
+0

的[每一個派生表必須有自己的別名】可能重複(http://stackoverflow.com/questions:我們通常可以通過複製或謂語移動到內聯視圖查詢,例如獲得更好的性能/ 1888779/every-derived-table-must-have-its-own-alias) –

+0

而不是解決它,你只是把它標記爲重複。打擾一下 !!如果我發佈一個問題,它只是意味着,現有的答案沒有奏效我的朋友! – Rajan

+0

至少對我來說,它看起來很像是派生表缺少別名,就像「......)**作爲透明**位置......」 - 其他問題非常清楚地回答 –

回答

2

您的查詢基本上形式:

select * 
    from sometable 
    where location='xyz'; 

在您的查詢,代替表名(如sometable),你已經使用了查詢作爲行來源。您從中選擇的查詢稱爲內聯視圖; MySQL將其稱爲派生表

錯誤消息是說您需要在查詢中爲該派生表指定名稱。您可以通過使用標識符(稱爲別名)來關閉標籤。例如,我們可以在短的別名v分配給派生表,例如:

select * 
    from (SELECT ...) v 
    where location='xyz' 

隨訪

即已分配給所述派生表別名是有效的名稱(標識符)查詢中其他地方的表格。正如我們可以指定一個別名錶,並且使用別名來限定列引用:

SELECT t.id 
     , t.somecol 
    FROM sometable t 
    WHERE t.location = 'xyz' 

我們可以使用派生表的別名限定引用:

SELECT v.* 
    FROM (SELECT ...) v 
    WHERE v.location = 'xyz' 

一個完全不同的音符...在性能方面:最外層查詢中的謂詞做而不是被推入內聯視圖。

SELECT v.* 
    FROM (SELECT ... 
      FROM sometable t 
      WHERE t.location = 'xyz' 
     ) v 
相關問題