mysql错误代码:1066非唯一表/别名:“t2”

8aqjt8rx  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(781)

我使用mysql工作台和mysql服务器来查询数据库。我有两张table t1 以及 t2 有一列 t1_name 以及 t2_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”
你能解释并纠正我的疑问吗?之前我发过这篇帖子,并尝试过以下查询:

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

但这需要永远,永远不会结束。

jfewjypa

jfewjypa1#

我想你把第二个where子句打错了,应该是

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

目前,您正在有效地将t2\u名称与自身进行比较。
不管怎么说,它都会非常慢,因为mysql将对它进行表扫描。在开始尝试使用数据进行分析之前,先看看您的数据结构和内容,看看是否可以更好地进行一些数据清理/重组。

qij5mzcb

qij5mzcb2#

从限定所有列名开始。这还会导致错误吗?

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 使用这种通配符的查询效率非常低。通常,您可以构造数据模型,以便编写更高效的查询。

4dc9hkyq

4dc9hkyq3#

你错过了比赛 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 . 更可能的是它的表现更糟。。。

相关问题