我有一个名为"LINK_INFO"的表,其中的URL位于名为"URL"的字段中。问题是,存在许多重复的 URL,除了一些使用尾随/来绕过唯一的字段要求。
例:
http://www.yahoo.com和http://www.yahoo.com/
我可以使用什么语句来选择这些近似重复的情况,以便我可以删除其中一个? 如果您能提供帮助,非常感谢。
您可以使用TRIM
来查找所有唯一值;
SELECT DISTINCT TRIM(TRAILING '/' FROM url) url
FROM link_info
SQLfiddle 进行测试。
要立即删除重复项,只需执行删除联接即可;
DELETE li1
FROM link_info li1
JOIN link_info li2
WHERE TRIM(TRAILING '/' FROM li1.url) =
TRIM(TRAILING '/' FROM li2.url)
AND li1.id<li2.id
另一个用于测试的SQL小提琴。
在运行网络上找到的任意 SQL 之前,请务必备份您的表,即使是我的:)
编辑:如果您的数据库计算机受到限制,您可能希望使用索引来执行此操作,并避免加载到内存中不必要的内容;
-- remove all trailing slashes
UPDATE link_info
SET url=TRIM(TRAILING '/' FROM url);
-- create an index on the resulting strings (if there isn't already one)
CREATE INDEX url_index ON link_info(url);
-- delete all duplicates
DELETE li1
FROM link_info li1
JOIN link_info li2
WHERE li1.url = li2.url
AND li1.id<li2.id;
-- drop the index if not needed anymore
DROP INDEX url_index ON link_info;
又是一把小提琴。
也许是这样的?
CREATE TABLE link_info (
url varchar(255));
INSERT INTO link_info VALUES
('http://www.yahoo.com/'),
('http://www.yahoo.com');
SELECT DISTINCT
CASE
WHEN SUBSTRING(url, LENGTH(url)) = '/'
THEN LEFT(url, LENGTH(url) -1)
ELSE url
END AS `url`
FROM link_info
结果
| 网址 |------------------------|http://www.yahoo.com |
观看演示
此时,您可以将其插入临时表,删除您的父项并重新填充。