2015-08-28 2 views
0

Я нашел несколько ответов, очень близких к решению, но не могу их применить из-за неопытности.MySQL view/query для удаления почти повторяющихся строк

Как:

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

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) 

UPDATE, если вам нужно, чтобы получить все пустые сек записи, а также вы можете:

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) 
+0

Это решение не позволит мне создать представление, я получаю сообщение об ошибке «View SELECT содержит подзапрос в предложении FROM». – Yourguide

+0

Это на самом деле лучший ответ .... НО У меня проблема, потому что некоторые из моих полей ABCNbr имеют NULL, а некоторые пустые. ОШИБКИ NULL остаются вне окончательного набора результатов. Есть ли способ оценить как NULL, так и пустой как пустой, чтобы сравнения могли выполняться? Когда появятся новые данные, я боюсь, что больше NULLS снова появится. Я попробовал IFNULL() внутри выбора левого соединения, но у меня все еще есть три вида записей .... NULL, Empty и те, у которых есть ABCNbr – Yourguide

+0

Я не понимаю эту проблему. можете ли вы объяснить пример источника данных и набор результатов на основе этих данных, чтобы проиллюстрировать, в чем проблема. – Alex

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

При каких обстоятельствах ABCNbr не be IN ABCNbr – Strawberry

+0

@Strawberry Вы правы :)))) – splash58

+0

Это еще глупая идея, но это не так. – Strawberry

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) 
0

выберите * из table_name где ABCNbr не в ( выберите ABCNbr из table_name где (выберите отсчет (ABCNbr) от table_name группы по ABCNbr)> 1 и ABCNbr = MPCNbr);