+----+--------------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+--------------+-----+-----------+----------+
| 1 | Ramesh Olive | 32 | Ahmedabad | 2000.00 |
| 2 | Tan Kau | 25 | Delhi | 1500.00 |
| 3 | Jason Tan Kau| 25 | Delhi | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Hardik Jass | 27 | Bhopal | 4500.00 |
| 7 | Muffy John | 24 | Indore | 10000.00 |
| 8 | Muffy Lee | 24 | Indore | 10000.00 |
+----+--------------+-----+-----------+----------+
在上面的例子中,假设表名是“table_a”,1)“Tan Kau”与“Jason Tan Kau”重复,2)“Hardik”与“Hardik Jass”重复
如何编写将产生如下输出的 SQL?
我认为这会起作用,但它应该很慢。有什么想法可以改进吗?
Select A.*, IF(B.ID IS NULL, "", "DUP") as DUP
FROM table_a A
LEFT JOIN table_a B
ON A.NAME LIKE CONCATE("%", B.NAME, "%") AND A.ID != B.ID
+----+--------------+-----+-----------+----------+-----+
| ID | NAME | AGE | ADDRESS | SALARY | DUP |
+----+--------------+-----+-----------+----------+-----+
| 1 | Ramesh Olive | 32 | Ahmedabad | 2000.00 | |
| 2 | Tan Kau | 25 | Delhi | 1500.00 | Dup |
| 3 | Jason Tan Kau| 25 | Delhi | 2000.00 | Dup |
| 4 | Chaitali | 25 | Mumbai | 6500.00 | |
| 5 | Hardik | 27 | Bhopal | 8500.00 | Dup |
| 6 | Hardik Jass | 27 | Bhopal | 4500.00 | Dup |
| 7 | Muffy John | 24 | Indore | 10000.00 | |
| 8 | Muffy Lee | 24 | Indore | 10000.00 | |
+----+--------------+-----+-----------+----------+-----+
您的查询可以通过添加反向条件返回预期结果:
我不知道它是否会更快,但另一种方法是使用 INSTR:
SQL小提琴
我做了一些不同的事情
注意:我基本上是抄袭了 Leigh 的答案并略微增加了它,所以请不要将我的答案标记为已接受!!!
我给出这个的原因是为了防止出现更多的副本
这是您的示例数据加上两个额外的行:
请注意我的增强查询如何正确处理重复数据
面对更多的重复,Leigh 的查询是这样的:
@LeighRiffel 的答案只需要嵌入子查询中并进行区分:
尽管如此,Leigh 的回答确实预先提供了所需的 SQL 原则。
因此,我给他+1!