SQL - где пункт другим оператором выбора? - PullRequest
2 голосов
/ 25 июня 2010

У меня следующий запрос:

select r.people_code_id [People Code ID], r.resident_commuter [Campus6],
c1.udormcom [AG], aR.RESIDENT_COMMUTER [AG Bridge], ar.ACADEMIC_SESSION,
ar.ACADEMIC_TERM, ar.academic_year, ar.revision_date
from RESIDENCY r
left join AG_Common..CONTACT1 c1 on r.PEOPLE_CODE_ID=c1.key4
left join AG_Common..CONTACT2 c2 on c1.ACCOUNTNO=c2.accountno
left join AGPCBridge..ArchiveRESIDENCY aR on r.PEOPLE_CODE_ID=aR.PEOPLE_CODE_ID
where r.ACADEMIC_YEAR='2010'
and r.ACADEMIC_TERM='Fall' 
and SUBSTRING(c1.udormcom,1,1)<>r.resident_commuter
and r.ACADEMIC_SESSION='Und 01'
and aR.ACADEMIC_SESSION='Und 01'
and aR.ACADEMIC_TERM='Fall'
and aR.ACADEMIC_YEAR='2010'
and SUBSTRING(c1.udormcom,1,1)=aR.RESIDENT_COMMUTER

Мне нужно добавить еще одно предложение в сегмент where. У меня есть этот запрос:

 select DISTINCT * from RESIDENCY where ACADEMIC_YEAR='2010' and
 ACADEMIC_TERM='Fall' and ACADEMIC_SESSION='Und 01' ORDER BY revision_date DESC

Это получает только последний ряд для каждого человека. Я хочу сделать что-то вроде (псевдокод):

WHERE r.people_code_id and r.revision_date are in (select DISTINCT * from
RESIDENCY where ACADEMIC_YEAR='2010' and ACADEMIC_TERM='Fall' and
ACADEMIC_SESSION='Und 01' ORDER BY revision_date DESC)

Я работаю в режиме совместимости с SQL 2000 (хотя на самом деле работает SQL 2008).

Ответы [ 3 ]

2 голосов
/ 25 июня 2010

Я переписал ваш запрос, основываясь на том, что вы хотели добавить:

WITH residency_cte AS (
     SELECT TOP (1)
            r.people_code_id, 
            r.resident_commuter,
            r.academic_year,
            r.academic_term,
            r.academic_session
       FROM RESIDENCY r
      WHERE r.academic_year = '2010'
        AND r.academic_term = 'Fall' 
        AND r.academic_session = 'Und 01'
   ORDER BY revision_date DESC)
   SELECT r.people_code_id, 
          r.resident_commuter [Campus6],
          c1.udormcom [AG], 
          aR.RESIDENT_COMMUTER,
          ar.ACADEMIC_SESSION,
          ar.ACADEMIC_TERM, 
          ar.academic_year, 
          ar.revision_date
     FROM residency_cte r
LEFT JOIN AG_Common..CONTACT1 c1 ON c1.key4 = r.PEOPLE_CODE_ID
                                AND SUBSTRING(c1.udormcom, 1, 1) != r.resident_commuter
LEFT JOIN AG_Common..CONTACT2 c2 ON c2.accountno = c1.ACCOUNTNO
LEFT JOIN AGPCBridge..ArchiveRESIDENCY aR ON aR.PEOPLE_CODE_ID = r.PEOPLE_CODE_ID
                                         AND aR.ACADEMIC_SESSION = r.academic_session
                                         AND aR.ACADEMIC_TERM = r.academic_term
                                         AND aR.ACADEMIC_YEAR = r.academic_year
                                         AND SUBSTRING(c1.udormcom, 1, 1) = aR.RESIDENT_COMMUTER

Единственное, что находится в столбце udormcom - как только я узнаю, из какой он таблицы, я перенесу предложение в объединения. Я также обновил объединения в таблицу ArchiveRESIDENCY, поэтому вам нужно настроить даты только в одном месте.

Но имейте в виду, что использование подстроки для сопоставления с другим столбцом никогда не будет работать хорошо - пока модель данных не изменится, чтобы исправить это, это никогда не будет действительно оптимизировано.

1 голос
/ 25 июня 2010

Вы можете использовать EXISTS с подзапросом

select 
    r.people_code_id [People Code ID], 
    r.resident_commuter [Campus6],
    udormcom [AG], 
    aR.RESIDENT_COMMUTER [AG Bridge], 
    ar.ACADEMIC_SESSION,
    ar.ACADEMIC_TERM, 
    ar.academic_year, 
    ar.revision_date
from RESIDENCY r
    left join AG_Common..CONTACT1 c1 
        on r.PEOPLE_CODE_ID=c1.key4
    left join AG_Common..CONTACT2 c2 
        on c1.ACCOUNTNO=c2.accountno
    left join AGPCBridge..ArchiveRESIDENCY aR 
        on r.PEOPLE_CODE_ID=aR.PEOPLE_CODE_ID
where r.ACADEMIC_YEAR='2010'
    and r.ACADEMIC_TERM='Fall' 
    and SUBSTRING(udormcom,1,1)<>r.resident_commuter
    and r.ACADEMIC_SESSION='Und 01'
    and aR.ACADEMIC_SESSION='Und 01'
    and aR.ACADEMIC_TERM='Fall'
    and aR.ACADEMIC_YEAR='2010'
    and SUBSTRING(udormcom,1,1)=aR.RESIDENT_COMMUTER
    and EXISTS 
    (
        select 1
    FROM RESIDENCY r2
    where 1=1
        and r2.revision_date  = ar.revision_date  /* note the join here */
            and ACADEMIC_YEAR='2010' 
            and ACADEMIC_TERM='Fall' 
        and ACADEMIC_SESSION='Und 01'

        /* the order by has been removed */
    )
0 голосов
/ 25 июня 2010
WHERE r.people_code_id in (select DISTINCT people_code_id
                           from RESIDENCY 
                           where ACADEMIC_YEAR='2010' 
                             and ACADEMIC_TERM='Fall'
                             and ACADEMIC_SESSION='Und 01' 
                             and revision_date = r.revision_date
                           ORDER BY revision_date DESC)

Я не думаю, что вам нужен «отдельный» или «заказ по».Удаление их должно улучшить производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...