我已经找到了几个非常接近解决方案的答案,但由于缺乏经验,我无法应用它们。
比如:
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时才返回。
我希望这是一个视图,这样我就可以像查询表一样查询它。更多的记录将被添加,这将继续重复发生,这就是为什么我想要视图。
发布于 2015-08-28 17:12:56
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)发布于 2015-08-28 16:52:55
select *
from table
where MPCNbr <> ABCNbr
and ABCNbr in (select ABCNbr from t1 where MPCNbr <> ABCNbr)发布于 2015-08-28 16:59:16
这是对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)https://stackoverflow.com/questions/32275990
复制相似问题