我找到了几个非常接近解决方案的答案,但由于经验不足而无法应用它们。
喜欢:
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时。
我希望这是一个视图,所以我可以像一个表一样查询它。将添加更多记录,这将继续重复发生,这就是我想要视图的原因。
答案 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)