首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除几乎重复行的MySQL视图/查询

删除几乎重复行的MySQL视图/查询
EN

Stack Overflow用户
提问于 2015-08-28 16:47:03
回答 4查看 311关注 0票数 1

我已经找到了几个非常接近解决方案的答案,但由于缺乏经验,我无法应用它们。

比如:

SQL Remove almost duplicate rows

SQLite3 Remove almost duplicate rows

我将把它简化为只是问题所在的列,但我需要返回整行数据。

栏:

代码语言:javascript
复制
RecNbr, MPCNbr, ABCNbr     
     1,    123,    123    
     2,  12080,    123  
     3,    456,    456    
     4,    789,    987    
     5,    321,    987
     6,   0053,    <NULL>
     7,   0021,    ''    

当我查询该数据时,我希望看到第2-7行,而不是第1行。

我的数据有两行表示相同的项,其中一行具有不同的数据,我需要返回一个MPCNbr和ABCNbr不匹配的行,但只有当另一行具有相同的ABCNbr时才返回。

我希望这是一个视图,这样我就可以像查询表一样查询它。更多的记录将被添加,这将继续重复发生,这就是为什么我想要视图。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-08-28 17:12:56

http://sqlfiddle.com/#!9/a5f3d/1

代码语言:javascript
复制
SELECT t.* 
FROM table1 t
LEFT JOIN
(SELECT ABCNbr,
  SUM(IF(MPCNbr=ABCNbr,1,0)) flag,
  COUNT(*) cnt
FROM table1
GROUP BY ABCNbr) filter
ON t.ABCNbr = filter.ABCNbr
WHERE (cnt>flag AND t.MPCNbr<>t.ABCNbr)
  OR  (cnt=flag AND t.MPCNbr=t.ABCNbr)

如果您需要获得所有空的记录,那么可以更新:

http://sqlfiddle.com/#!9/8e79a/1

代码语言:javascript
复制
SELECT t.* 
FROM table1 t
LEFT JOIN
(SELECT ABCNbr,
  SUM(IF(MPCNbr=ABCNbr,1,0)) flag,
  COUNT(*) cnt
FROM table1
GROUP BY ABCNbr) filter
ON t.ABCNbr = filter.ABCNbr
WHERE (cnt>flag AND t.MPCNbr<>t.ABCNbr)
  OR  (cnt=flag AND t.MPCNbr=t.ABCNbr)
  OR IF(COALESCE(TRIM(t.ABCNbr),'')='',1,0)
票数 1
EN

Stack Overflow用户

发布于 2015-08-28 16:52:55

代码语言:javascript
复制
select * 
    from table 
  where MPCNbr <> ABCNbr 
    and ABCNbr in (select ABCNbr from t1 where MPCNbr <> ABCNbr)
票数 1
EN

Stack Overflow用户

发布于 2015-08-28 16:59:16

这是对NOT EXISTS的一个很好的使用

代码语言:javascript
复制
SELECT *
FROM the_table AS t1
WHERE MPCNbr != ABCNbr
  OR NOT EXISTS (SELECT 1 FROM the_table AS t2 WHERE t1.ABCNbr = t2.ABCNbr AND t2.ABCNbr = t2.MPCNbr)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32275990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档