Таким образом, у нас были дублированные сценарии 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 имеет дубликаты, поэтому... не нужно беспокоиться о проверке дубликатов.