这个问题涉及到MySQL中的派生表,涉及到派生表就必须给这个派生表一个别名。如果没有别名就会出现如标题所示的错误。如果读者理解select查询模型的话,对这个问题应该就会好理解一点。
下面用一个实际案例来说明:
原始需求是补订单,那么补完订单你怎么验证补进去的单是没问题的呢?其中一个就是查看是否有脏数据。我的做法就是先把补进去的单的订单号都查出来,然后通过order by 分组,通过having与count函数来找出是否有重复数据(重复数据就是脏数据)。很多人第一次写,思路都是正确的,就像下面这样,运行后结果是Every derived table must have its own alias。
SELECT
COUNT(channel_tid),
channel_tid
FROM
(
SELECT
channel_tid
FROM
trade
WHERE
channel_tid IN (
'127947772',
'127845735',
'127413932',
'122137178',
'128038001',
'127923270',
'122915384',
'127173769',
'122925270',
'118909384',
'122029905',
'127678951',
)
)
GROUP BY
channel_tid
HAVING
COUNT(channel_tid) > 1
出现上述情况的原因是因为在MySQL中使用派生表(也可以理解为from型子查询,将查询的结果当成from的对象)必须要有个别名。用AS加一个别名就可以正常运行了
SELECT
COUNT(channel_tid),
channel_tid
FROM
(
SELECT
channel_tid
FROM
trade
WHERE
channel_tid IN (
'127947772',
'127845735',
'127413932',
'122137178',
'128038001',
'127923270',
'122915384',
'127173769',
'122925270',
'118909384',
'122029905',
'127678951',
)
) AS a
GROUP BY
channel_tid
HAVING
COUNT(channel_tid) > 1
结论:派生表必须要有别名
版权声明:本文为qq_42396796原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。