我使用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`,'%'));
但这需要永远,永远不会结束。
3条答案
按热度按时间jfewjypa1#
我想你把第二个where子句打错了,应该是
目前,您正在有效地将t2\u名称与自身进行比较。
不管怎么说,它都会非常慢,因为mysql将对它进行表扫描。在开始尝试使用数据进行分析之前,先看看您的数据结构和内容,看看是否可以更好地进行一些数据清理/重组。
qij5mzcb2#
从限定所有列名开始。这还会导致错误吗?
如果你的问题是性能,那么
not exists
如果没有distinct
:然而,这不会有太大的改善。不幸的是,
like
使用这种通配符的查询效率非常低。通常,您可以构造数据模型,以便编写更高效的查询。4dc9hkyq3#
你错过了比赛
WHERE
关键字。解析器认为t2
应为的别名t1
如下所示t1
. 但是t2
已被上一个t2
.插入
WHERE
(并拆下最后一个封口)
):旁注:恐怕你尝试构建笛卡尔积不会比
NOT EXISTS
. 更可能的是它的表现更糟。。。