Синтаксис Sql, чтобы всегда получать один

#vb.net #entity-framework #sql

#vb.net #entity-framework #sql

Вопрос:

 SELECT  dbo.Calls.Description, dbo.TicketRead.IsRead, dbo.TicketRead.UserID
FROM    dbo.Calls 
LEFT OUTER JOIN dbo.TicketRead ON dbo.Calls.CallID = dbo.TicketRead.TicketID 
WHERE dbo.TicketRead.UserID = 1 or is null
  

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

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

Я использую msSql и .net entity framework.

Ответ №1:

Вы уверены, что хотите ограничить таблицу TicketRead только идентификатором пользователя # 1?

 SELECT  c.Description, r.IsRead, r.UserID
FROM    dbo.Calls c
LEFT JOIN dbo.TicketRead r 
   ON c.CallID = r.TicketID 
   AND r.UserID = 1
  

Это выполняется при объединении на нескольких условиях… Вы получите все вызовы, но только флаг isRead из TicketRead, когда идентификатор пользователя # 1 прочитает его.

Я не уверен, что это действительно то, что вы ищете, и я буду доступен для обновления этого позже, если нет.

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

Комментарии:

1. Спасибо за то, что это работает!. но как бы я это сделал из entity framework?

Ответ №2:

вы хотите сделать следующее:

 SELECT  dbo.Calls.Description, dbo.TicketRead.IsRead, dbo.TicketRead.UserID
FROM    dbo.Calls 
LEFT OUTER JOIN dbo.TicketRead ON dbo.Calls.CallID = dbo.TicketRead.TicketID 
WHERE 
dbo.TicketRead.UserID = 1 
or dbo.TicketRead.CallID IS NULL
  

по сути, мы говорим здесь, что если есть идентификатор пользователя, он должен быть равен 1. в противном случае первичный ключ записи равен null (из-за объединения). Ответ Фоско тоже правильный и намного меньше 🙂