mysql错误代码:1066。非唯一表/别名:'t2'

时间:2018-07-29 13:07:54

标签: mysql sql mysql-workbench

我正在使用mysql工作台和mysql服务器来查询数据库。我有两个表t1t2,其中一列为t1_namet2_name。 t2有300万条记录,t1有100万条记录。

我需要选择所有t2_names不等于t2_names或不是t1_name的子串的所有t1_name。当我尝试以下查询时:

SELECT DISTINCT `t2_name`
FROM `t2`, `t1`
`t2`.`t2_name` NOT LIKE CONCAT('%',`t1`.`t1_name`,'%'));

我收到此错误:

  

mysql错误代码:1066。不是唯一的表/别名:'t2'

能否请您解释和更正我的查询?以前,我做了this post并尝试了以下查询:

SELECT DISTINCT `t2_name`
FROM `t2`
WHERE NOT EXISTS (SELECT * FROM `t1`
                    WHERE `t2_name` LIKE CONCAT('%',`t2_name`,'%'));

但是它需要永远,并且永远不会结束。

3 个答案:

答案 0 :(得分:0)

首先限定所有列名称。这仍然会导致错误吗?

SELECT DISTINCT t2.t2_name
FROM t2 JOIN
     t1
     ON t2.t2_name NOT LIKE CONCAT('%', t1.t1_name, '%');

如果您的问题是性能问题,那么在没有not exists的情况下,distinct会更好:

SELECT t2_name
FROM t2
WHERE NOT EXISTS (SELECT 1
                  FROM t1
                  WHERE t2.t2_name LIKE CONCAT('%', t1.t1_name, '%')
                 );

但是,这不会有太大的改善。不幸的是,使用这种通配符的like查询效率很低。通常,您可以构建数据模型,以便编写更有效的查询。

答案 1 :(得分:0)

您缺少WHERE关键字。解析器认为t2应该是t1的别名,因为它紧随t1之后。但是t2已被先前的t2占据。

插入WHERE(并删除最后一个关闭的)):

SELECT DISTINCT `t2_name`
FROM `t2`, `t1`
WHERE `t2`.`t2_name` NOT LIKE CONCAT('%',`t1`.`t1_name`,'%');

侧面说明:恐怕您尝试构建笛卡尔积的效果不会比NOT EXISTS更好。它执行的可能性更大,更差...

答案 2 :(得分:0)

我认为您输错了第二个where子句,它应该说

SELECT DISTINCT `t2_name`
FROM `t2`
WHERE NOT EXISTS (SELECT * FROM `t1`
                    WHERE `t1_name` LIKE CONCAT('%',`t2_name`,'%'));

目前,您正在有效地将t2_name与自身进行比较。

无论如何它都会很慢,因为mysql将对此进行表扫描。在开始尝试将其用于分析之前,请查看一下您的数据结构和内容,并查看是否最好进行一些数据清理/重组。