SQL Выберите ГДЕ дублировать в одном столбце x И столбец y != z

Таким образом, у нас были дублированные сценарии SQL, работающие на нашем сервере, и мы не осознавали этого до недавнего времени. По сути, у меня много строк, в которых есть 2 записи с одним и тем же столбцом x (crn).

Первоначально он был введен с тем же столбцом y (статус). В нашем приложении пользователи обновляют столбец y (статус). Однако теперь у нас есть 2 строки, одна со статусом «S», а другая со статусом, отличным от «S». Моя цель:

УДАЛИТЬ все из таблицы, ГДЕ есть дубликат CRN и СТАТУС S. Я не хочу удалять строки, если нет дубликата, но если он есть, я хочу удалить только строку со статусом «S» . Кроме того, я бы предпочел не удалять обе записи, если обе имеют статус S, но если я это сделаю, это не такая уж большая проблема, потому что я снова получу курсы при следующей загрузке.

Я начал делать оператор select для запроса нужных мне строк, но не знаю, как выполнить часть ONLY SELECT IF DUPLICATE EXISTS. Я чувствую, что мне нужно UNION или LEFT JOIN или что-то еще, чтобы получать записи только в том случае, если существует дубликат.

SELECT * FROM 
cas_usuECourses 
WHERE 
crn IN (SELECT crn FROM cas_usuECourses GROUP BY crn having count(1) > 1)
AND status = 'S'
AND termCode = 201320

РЕДАКТИРОВАТЬ: Есть ли способ сказать... выше, но если у обоих дубликатов есть «S», удалите только один из них?

РЕДАКТИРОВАТЬ: я «думаю», что это выглядит хорошо для меня. Есть предположения?

SELECT id FROM (
    SELECT id, Row_Number() Over (Partition By crn ORDER BY id DESC) as ranking
    FROM cas_usuECourses
    WHERE status = 'S'
    AND termCode = 201320
) as ranking

ГДЕ рейтинг = 1

Я думаю, что это даст мне все идентификаторы со статусом «S», и если их два со статусом «S», это даст мне тот, который был создан вторым. Я обнаружил, что каждая запись в нашем termCode имеет дубликаты, поэтому... не нужно беспокоиться о проверке дубликатов.


person Leeish    schedule 26.10.2012    source источник
comment
Что искали/пробовали? Какая РДМС? Возможные дубликаты: здесь, здесь и здесь.   -  person Kermit    schedule 26.10.2012
comment
Что ж, я искал здесь информацию о дубликатах, но не нашел ничего похожего на то, что мне нужно.   -  person Leeish    schedule 26.10.2012
comment
Информация здесь поможет вам на правильном пути.   -  person Kermit    schedule 26.10.2012
comment
Турбот Что такое СУБД? Рэнди, я не понимаю, что 1 и * возвращают одинаковое количество результатов. Вышеприведенное дает мне почти хорошие данные, я просто хочу удалить только одну строку, где статус = «S», а не обе.   -  person Leeish    schedule 26.10.2012
comment
@Leeish какую базу данных ты используешь? MySQL? SQL-сервер? Оракул?   -  person Matthew    schedule 26.10.2012


Ответы (1)


Если бы вы могли добавить один столбец в свою таблицу и заполнить его различными значениями, это было бы тривиально — вы могли бы ориентироваться на каждую строку.

В противном случае, после вашего начального шага, я бы обычно открывал курсор на вашем подзапросе со статусом S, чтобы выбрать только crn, где оба статуса равны «S», и в каждой итерации цикла удалить первую запись 1 с соответствующим crn. Таким образом, вы можете избавиться от повторяющихся пар crn/status.

person OzrenTkalcecKrznaric    schedule 26.10.2012
comment
@Leeish - курсор неэффективен, но иногда необходим (по крайней мере, в SQL Server) для перебора записей таблицы базы данных. См. пример здесь. Используя курсор, вы можете исправить это. И не забудьте использовать транзакцию для проверки кода, если вы запускаете его на рабочем сервере! - person OzrenTkalcecKrznaric; 27.10.2012