2016-08-19 2 views
2

У нас есть 2 стола Бронирование, Ticket. Ticket.BookingId является внешним ключом к Booking.Id: enter image description hereВыберите записи с соответствующими записями определенного типа

Как написать SQL выбрать (совместимый с MS SQL Server) для отдельных заказов, который имеет только билеты типа 1 или 3 или 7?

Что-то как:

select Booking.Id 
from Booking 
    join Ticket on Ticket.BookingId = Booking.Id 
group by Booking.Id 
having Ticket.Type IN (1,3,7) 

К примеру, в этом случае:

enter image description here

конечный результат будет: 2,3.

Booking.Id = 1 не в конечном результате, так как в таблице Билет Билет (Id = 4, BookingId = 1, Тип = 8), так что это бронирование также содержит другой тип билета, чем 1 или 3 или 7

Решение в LINQ:

var result = (from b in Booking 
join t in Ticket on Booing.Id equals Ticket.BooingId 
group new {b,t} by b.Id).Where(group => group.Where(itemOfGroup=>itemOfGroup.Ticket.Type != 1 && itemOfGroup.Ticket.Type != 3 && itemOfGroup.Ticket.Type != 7).Count() == 0).Select(group => group.Key); 
+0

в случае 'BookingId: 1' имеют' Тип: 1, 3, 7, 8 . Нужно ли возвращать «Забыть: 1» в конечном результате или нет? Потому что вы упомянули только «1, 3, 7»! – Arulkumar

+0

Нет. Это сущность моей проблемы. Мне нужно в конечном итоге только заказы, которые не содержат другой тип билета, чем 1,3,7. Если бронирование также содержит билет типа 8, это бронирование не может быть окончательным. –

ответ

3

Group при резервировании и принимать только те группы, не имеющие других видов

select Booking.Id 
from Booking 
join Ticket on Ticket.BookingId = Booking.Id 
group by Booking.Id 
having sum(case when Ticket.Type NOT IN (1,3,7) then 1 else 0 end) = 0 
+1

OP назвал типы «1 _or_ 3 _or_ 7». Поэтому я предположил, что любой из этих типов есть, но не другие. Будет ли ваш запрос искать, например, заказы, которые имеют только тип 3 или имеют тип 1 и 3, но не 7? Это не похоже на это, но поправьте меня, если я ошибаюсь – ADyson

+0

Вы абсолютно правы! Меняя это прямо сейчас. Благодарю. –

+0

выглядит хорошо сейчас. upvoted – ADyson

Смежные вопросы