2013-03-26 2 views
1

Я для жизни меня не вижу, что мне здесь не хватает, но может кто-то указать мне, почему первый запрос не делает то, что я хочу, но второй работает отлично ? Я знаю, что запросы не совсем то же самое, но они должны возвращать те же 20 строк, а они нет. (заливка запрос найти 20 самых распространенных элементов в одной таблице)Простые места где находится

select distinct 
      rx.drug_class 
     from rx 
     where exists 
     (
      select top 20  
        rx2.drug_class 
        ,COUNT(distinct rx2.pat_id) as counts 
        ,RANK() over(order by count(distinct pat_id) desc) as rn 
        from rx as rx2 
        --when the line below is commented out 
        --this subquery gives the correct answer 
        where rx.drug_class = rx2.drug_class 
        group by rx2.drug_class 
     ) 

Это один работает отлично

select distinct 
     rx.drug_class 
     from rx 
     where rx.drug_class in 
     (
      select top 20 rx.drug_class 
       from rx 
       group by rx.drug_class 
       order by COUNT(distinct pat_id) desc 
     ) 

где положение в Exists подзапрос не работает, что дает?

+0

Вы уверены, что комментируете 'где rx.drug_class = rx2.drug_class' заставляет его работать. Удаление этой ссылки на основной запрос преобразует предложение Exists в 'EXISTS (SELECT * FROM rx)' –

ответ

5

Даже если вы присваиваете номер строки для первого запроса, вам все еще нужно ORDER BY этот номер строки:

where rx.drug_class = rx2.drug_class 
group by rx2.drug_class 
order by rn 

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

select top 20 rx.drug_class 
from rx 
group by rx.drug_class 
order by COUNT(distinct pat_id) desc 

EDIT:

Ваш EXISTS также не будет работать, потому что вы ограничиваете набор для ма tching строк во внутреннем SELECT для строк во внешнем наборе перед выполнением вашего подсчета ... так что строка всегда будет находиться в счете top 20 в этом случае.

IN работает, потому что это один набор отсчетов для всех строк ... EXISTS не работает, потому что подсчет выполняется для каждой отдельной строки во внешнем наборе ... так что каждая строка во внешнем наборе находится в верхний 20 подсчитывает, когда эти подсчеты ограничиваются только внешней строкой drug_class.

+1

Почему это? Если я прокомментирую, где у него есть ссылка на внешний запрос, получите результат в порядке – wootscootinboogie

+0

Я выполнил тот же запрос с порядком по rn, и я все равно получаю тот же набор результатов. – wootscootinboogie

+0

Я спросил, потому что я недоумеваю, почему подзапрос 'exists' не работает. :) – wootscootinboogie

1

Насколько Я знаю EXISTS пункт просто возвращает значение TRUE или FALSE. Итак, если СУЩЕСТВУЕТ 20 строк из подзапроса, это означает TRUE, а не фильтр, как в случае с предложением IN.