Обьединение двух выборок или сложное ограничение в Transact sql

Многие программисты новички, особенно начавшие с классических языков программирования, считаю 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

Достаточно один раз понять принцип объединения запроса со вложенным запросом, и многие задачи будут решаться гораздо быстрее.

Основы вложенных запросов


Комментарии

Обьединение двух выборок или сложное ограничение в Transact sql — 1 комментарий

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>