Есть ли способ в SQL использовать запрос, эквивалентный следующему:
select * from table1, table2 where some_join_condition
and some_other_condition and count(distinct(table1.id)) < some_number;
Скажем, таблица1 представляет собой таблицу сотрудников. Затем соединение приведет к тому, что данные о том, что один сотрудник будет распространен по нескольким строкам. Я хочу ограничить количество отдельных сотрудников, возвращенных на некоторое количество. В этом случае условие на номер строки или что-то подобное не будет достаточным.
Итак, каков наилучший способ получить тот же эффект, что и тот же вывод, что и указанный выше запрос?
select *
from (select * from employee where rownum < some_number and some_id_filter), table2
where some_join_condition and some_other_condition;
Это будет работать почти для всех БД
SELECT *
FROM table1 t1
INNER JOIN table2 t2
ON some_join_condition
AND some_other_condition
INNER JOIN (
SELECT t1.id
FROM table1 t1
HAVING
count(t1.ID) > someNumber
) on t1.id = t1.id
Некоторые БД имеют специальный синтаксис, чтобы сделать это немного eaiser.
Возможно, у меня нет полного понимания того, что вы пытаетесь выполнить, но, допустим, вы пытаетесь получить его до 1 строки на одного сотрудника, но каждое соединение вызывает несколько строк на сотрудника и группировку по имени сотрудника и другие поля по-прежнему недостаточно уникальны, чтобы довести их до одной строки, тогда вы можете попробовать использовать ранжирование и разбиение на разделы, а затем выбрать ранг, который вы предпочитаете для каждого раздела сотрудников.
См. пример: http://msdn.microsoft.com/en-us/library/ms176102.aspx