2013-02-15 4 views
0

У меня есть одна таблица с несколькими строками с несколькими типами событий.SQL, использующий несколько значений в подзапросе в той же таблице

Каждое событие начала имеет конечное событие. Из-за выбора дизайна начальное событие имеет идентификатор конечного события в столбце, но не наоборот. Аналогичным образом, причина начала не такая, как конечная причина.

Мои колонки:

eventTYPE - the type of event (start, end, terminate etc) 
eventID - unique ID 
eventDate - date the event will happen 
endEvent - ID of end event (if event type <> start - this will be NULL) 
reason - Reason for the event 

мне нужно вернуть все типСобытия = END Это Сравнительное типСобытия = причина START не является определенной причине на указанный пользователем дату.

Я знаю, что мне нужно использовать следующие три утверждения, но я не уверен, как их объединить.

SELECT eventId 
FROM Events 
WHERE eventType='END' and eventDate='<USER SPECIFIED>' 

SELECT endEvent  
FROM Events 
WHERE eventType='START' and reason <> 'mgp' and endEvent='<ID FROM ABOVE>' 

SELECT * 
FROM dbo.Events 
WHERE eventType='END' and eventId='<END EVENT FROM ABOVE>' 

Любая помощь приветствуется!

+0

.... Почему вы храните конечные события в этой таблице? Я имею в виду, это для таких событий, как концерты и т. Д., Правильно? Почему бы просто не поставить дату окончания (или продолжительность) в ту же строку? В чем разница между событием «end» и событием «terminate»? Почему причины для начала и конца событий различны? –

ответ

0

Как насчет

SELECT * 
FROM dbo.Events 
WHERE eventType='END' and eventId IN (

    SELECT endEvent  
    FROM Events 
    WHERE eventType='START' and reason <> 'mgp' and endEvent IN (

     SELECT eventId 
     FROM Events 
     WHERE eventType='END' and eventDate='<USER SPECIFIED>' 

    ) 
) 
2

Запрос что-то вроде этого:

select * 
from events se left outer join 
    events ee 
    on se.endevent = ee.eventid and se.eventtype = 'start' and ee.eventtype = 'end' 
where ee.eventdate = '<USER SPECIFIED>' and 
     se.reason <> 'mgp' 

Это просто соединяет события вместе, соответствующие начала и окончания записи, а затем применяет логику к этому результату ,