这次我被mysql别名所震撼。我不确切地知道这是什么意思以及如何解决它。查询是:
select * from (SELECT distinct * FROM $tableName1
where not exists (select NULL from $tableName2
where $tableName1.cid=$tableName2.cid)
)
where location='xyz';
答案 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