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

时间:2015-08-28 16:47:04

标签: mysql

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

喜欢:

SQL Remove almost duplicate rows

SQLite3 Remove almost duplicate rows

我会将此简化为问题所在的列,但我需要返回整行数据。

专栏:

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时。

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

4 个答案:

答案 0 :(得分:1)

select * 
    from table 
  where MPCNbr <> ABCNbr 
    and ABCNbr in (select ABCNbr from t1 where MPCNbr <> ABCNbr)

答案 1 :(得分:0)

这对NOT EXISTS

非常有用
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)

答案 2 :(得分:0)

  

从table_name中选择*,其中ABCNbr不在(   从table_name中选择ABCNbr   其中(由ABCNbr从table_name group中选择count(ABCNbr))&gt; 1   和ABCNbr = MPCNbr);

答案 3 :(得分:0)

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

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

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)