Что не так с этим запросом?Я не получаю правильные результаты - PullRequest
0 голосов
/ 11 февраля 2011

Что не так с этим запросом, пожалуйста, дайте мне знать. Во внутреннем запросе я хочу выбрать первую группу на основе EventID.

Пожалуйста, предложите, что делать.

SELECT TOP 1 * FROM
    (
    SELECT E.EventID, ETD.EventName, ED.EventDate FROM 
    [3rdi_EventDates] AS ED inner join [3rdi_Events] as E on ED.EventID=E.EventID 
    inner join [3rdi_EventTypeDetails] as ETD on E.EventTypeId=ETD.EventTypeId
    WHERE E.EventID in
    (
    select EventId from [3rdi_Events] WHERE
    EventID IN (select distinct EventId from [3rdi_EventDates] where EventDate Between '2/9/2011' and '3/11/2012')
    ) ORDER BY ETD.EventName, ED.EventDate  
    ) AS temp Group by EventID

Ответы [ 2 ]

1 голос
/ 11 февраля 2011

Вы хотите одну запись на EventID, в этом случае используйте Row_Number () и разбиение.

Ваши два уровня подзапроса также не нужны, внутренние объединения включают обе таблицы в подзапросах, так что вы можете фильтровать непосредственно в основном запросе.

Последнее, что нужно отметить, это то, что литералы даты лучше всего записывать, используя YYYYMMDD, чтобы быть устойчивыми к любым региональным настройкам или настройкам даты.

SELECT EventID, EventName, EventDate
FROM (
    SELECT E.EventID, ETD.EventName, ED.EventDate,
        ROW_NUMBER() over (
            partition by E.EventID 
            ORDER BY ETD.EventName, ED.EventDate) RowNum
    FROM [3rdi_EventDates] AS ED
    inner join [3rdi_Events] as E on ED.EventID=E.EventID 
    inner join [3rdi_EventTypeDetails] as ETD on E.EventTypeId=ETD.EventTypeId
    where ED.EventDate Between '20110209' and '20120311'
    ) AS temp
WHERE RowNum = 1
0 голосов
/ 11 февраля 2011

Используйте это.

SELECT TOP 1 * FROM  (
    SELECT E.EventID, ETD.EventName, ED.EventDate FROM 
    [3rdi_EventDates] AS ED inner join [3rdi_Events] as E on ED.EventID=E.EventID 
    inner join [3rdi_EventTypeDetails] as ETD on E.EventTypeId=ETD.EventTypeId
    WHERE ED.EventDate > Convert(Datetime,'2/9/2011') and ED.EventDate < Convert(Datetime,'3/11/2012')
    ORDER BY ETD.EventName, ED.EventDate)
...