다음과 유사한 스키마가 있습니다.
Person
----------------
Id (PK)
Name
EventRegistration
----------------
EventId (PK, FK)
PersonId (PK, FK)
DateRegistered
-- EDIT: Note that a single person can registered for multiple events.
제공된 날짜 범위 내에서 발생한 이벤트에 대해 등록한 모든 사람의 이름을 검색하는 쿼리를 작성해야합니다 (예 : 및에 속해야 DateRegistered
함 ). 트릭은 입력 매개 변수가 선택 사항이라는 것입니다. 따라서 시작 날짜 만, 종료 날짜 만 또는 둘 다 정의하지 않을 수 있습니다. 이들은 각각 "이 범위 내의 모든 것", "이 날짜 이후의 모든 것", "이 날짜 이전의 모든 것"및 "이벤트 등록에 관계없이 모든 사람"으로 해석됩니다.DateRangeStart
DateRangeEnd
그래서 나는 작동하는 것을 생각해 냈지만 이것을 개선하는 데 도움을 얻을 수 있는지 궁금합니다.
-- Assume parameters @DateRangeStart and @DateRangeEnd (both date) are provided by user input
SELECT p.Name
FROM Person p
WHERE
(@DateRangeStart IS NULL OR EXISTS (
SELECT TOP 1 PersonId
FROM EventRegistration
WHERE PersonId = p.Id
AND DateRegistered >= @DateRangeStart
AND (@DateRangeEnd IS NULL OR DateRegistered <= @DateRangeEnd)
)
) AND
(@DateRangeEnd IS NULL OR EXISTS (
SELECT TOP 1 PersonId
FROM EventRegistration
WHERE PersonId = p.Id
AND (@DateRangeStart IS NULL OR DateRegistered >= @DateRangeStart)
AND DateRegistered <= @DateRangeEnd
)
)
다음과 같이 작동합니다.
SELECT DISTINCT p.Name
FROM Person p
LEFT JOIN EventRegistration e
ON p.Id = e.PersonId
WHERE (@DateRangeStart IS NULL OR DateRegistered >= @DateRangeStart)
AND (@DateRangeEnd IS NULL OR DateRegistered <= @DateRangeEnd)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다