我正在使用mysql工作台和mysql服务器来查询数据库。我有两个表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'
能否请您解释和更正我的查询?以前,我做了this post并尝试了以下查询:
SELECT DISTINCT `t2_name`
FROM `t2`
WHERE NOT EXISTS (SELECT * FROM `t1`
WHERE `t2_name` LIKE CONCAT('%',`t2_name`,'%'));
但是它需要永远,并且永远不会结束。
答案 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将对此进行表扫描。在开始尝试将其用于分析之前,请查看一下您的数据结构和内容,并查看是否最好进行一些数据清理/重组。