SQL запрос для поиска дублей по значениям двух столбцов

Условия задачи: есть некая БД, где есть строки, в которых значения одного столбца равны, и значения второго столбца имеют одинаковые значения. Необходимо написать SQLзапрос для вывода строк, подпадающих под условия задачи.

Реальный кейс с моей работы на должности веб тестировщика. На торговом портале данные по заказам пишутся в БД. Изначально предполагалось, что в рамках одного заказа не может быть более одной строки с одним и тем же товаром. В какой-то момент момент эта логика на портале сломалась и мне поставили задачу на поиск заказов с дублями товаров.

По простому нужно было найти в базе данных заказы, в которых один и тот же товар в заказе был прописан более одного раза. Наглядно эту проблему можно изучить на следующем рисунке:

Сходу задачу решить не удалось, пришлось поломать голову. В итоге sql запрос, позволяющий вывести все дубли, оказался не таким и сложным. Было сделана выборка одной и той же таблицы и потом произведено сравнение с помощью оператора JOIN.

Окончательное решение выглядит так:

SELECT ord.* FROM Orders AS ord JOIN(SELECT * FROM Orders GROUP BY DELIVERY_TIME, USER_ID HAVING COUNT(DELIVERY_TIME)>1 ORDER BY DELIVERY_TIME) AS tmp
ON (ord.USER_ID=tmp.USER_ID AND NOT ord.ORDERS_ID=tmp.ORDERS_ID AND ord.DELIVERY_TIME=tmp.DELIVERY_TIME) WHERE tmp.ORDERS_ID IS NOT NULL;

Кому интересно, как этот запрос работает на конкретном примере, смотрите видео. В нем все расписано элементарным языком. Как говорится, все показываю на пальцах:

Если данный запрос завершается ошибкой: The ONLY_FULL_GROUP_BY issue, то рекомендую перед выполнением запроса выполнить следующую команду:

set session sql_mode='';

Мне это помогло.

Понравилась статья? Поделиться с друзьями:
Интересно о полезном
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.