这个问题涉及到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 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_42396796/article/details/111183642