Многие программисты новички, особенно начавшие с классических языков программирования, считаю sql весьма примитивным средством для выборок данных, которые затем обрабатываются внутри программы. На самом деле sql запросы позволяют очень быстро и легко решать весьма сложные задачи, просто их структура резко отличается от привычных циклов, ветвлений и классов. Этой заметкой я надеюсь начать серию примеров, которые вызовут успешку у опытных мастеров, но могут оказаться крайне полезными для новичков.
Задача: выбрать все строки из таблицы, определенное поле которых встречается в данной таблице в двух и более строках. Новичок сразу подумает о циклах, но на самом деле с задачей справится очень простой и короткий запрос.
В качестве ограничиваюшего условия для первой выборки будем использовать другую выборку из той же таблицы, содержащую только повторяющиеся строки и присоединенную к первой с помощью INNER JOIN, который и будет являться ограничивающим условием.
SELECT SOME_FIELD1, SOME_FIELD2, DUPLICATING_FIELD FROM SOME_TABLE AS result --- соединение-ограничивающее условие JOIN ( SELECT DUPLICATING_FIELD, COUNT(*) AS DUPLICATE_COUNT FROM SOME_TABLE WHERE SOME_FIELD3 IS NOT NULL -- группировка по дублирующемуся полю GROUP BY DUPLICATING_FIELD -- количество строк с одинаковым дублирующимся полем больше 1 HAVING COUNT(*) > 1 ) AS doubles ON result.DUPLICATING_FIELD = doubles.DUPLICATING_FIELD ORDER BY result.DUPLICATING_FIELD
Достаточно один раз понять принцип объединения запроса со вложенным запросом, и многие задачи будут решаться гораздо быстрее.
It's good to get a fresh way of loknoig at it.