派生表必须有自己的别名

时间:2015-07-04 02:06:03

标签: mysql sql alias

这次我被mysql别名所震撼。我不确切地知道这是什么意思以及如何解决它。查询是:

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

1 个答案:

答案 0 :(得分:2)

您的查询基本上是以下形式:

  select * 
    from sometable 
   where location='xyz';

在您的查询中,您使用查询作为行源来代替表名(如sometable)。您选择的查询称为内联视图; MySQL将其称为派生表

错误消息表明您需要在查询中为该派生表分配名称。您可以通过使用名为别名的标识符来关闭关闭paren。例如,我们可以为派生表分配一个简短的别名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'  

完全不同的说明......就性能而言:最外层查询中的谓词 not 被推入内联视图。通过将该谓词复制或移动到内联视图查询中,我们通常可以获得更好的性能,例如:

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