2015-09-29 2 views
1

Я работаю над веб-приложением в asp.net, и я использую SQL, предоставленный VS Community 2015 для создания и управления БД.SQL Server Compact: Left Join возвращает только одну строку для записей MOST

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

Однако моя хранимая процедура выполняет только одну из четырех строк, которые я хочу, чтобы она извлекала FOR MOST из моих записей. Пока я тестировал свой код, я привык использовать только один профиль, для которого он работает так, как ожидалось. Это странная часть для меня ... У вас есть идеи, почему это происходит?

create proc UserProfile 
@email varchar(100) 
as 
begin 
select * from TabelNume where email = @email 
declare @moduleID int 
declare @participantID int 
select @moduleID = Session_Fk from TabelNume where [email protected] 
select @participantID = id from TabelNume where [email protected] 
select * from Modules where Id = @moduleID; 
select * from Meetings left outer join Scales on Meetings.Id = Scales.Meeting_FK 
    where Meetings.Module_FK = @moduleID and (Participants_FK = @participantID or Participants_FK is null) 
end 

Так вот, когда я бегу spUserProfile '[email protected]' он извлекает 4 строки для моего соединения.

Однако, когда я запускаю spUserProfile '[email protected]', он выбирает только 1 строку. Эта строка является последней записью с Meetings.Module_FK, как указано в sp. Любая помощь приветствуется! Благодаря!

+0

SQL Server, который поставляется с VS Community 2015, скорее всего, ** не ** SQL Server Compact (CE) - это устаревшее. Скорее всего, это SQL Server ** LocalDB ** (версия для программиста Express) –

ответ

0

Вы должны поместить условия в пункт on, а не в пункт where. Вот ваш запрос:

select * 
from Meetings left outer join 
    Scales 
    on Meetings.Id = Scales.Meeting_FK 
where Meetings.Module_FK = @moduleID and 
     (Participants_FK = @participantID or Participants_FK is null) 

И это то, что должно быть:

select * 
from Meetings left outer join 
    Scales 
    on Meetings.Id = Scales.Meeting_FK and 
     Participants_FK = @participantID 
where Meetings.Module_FK = @moduleID; 

Почему они не эквивалентны? Ну, это немного сложно объяснить. Первая версия кажется, что она должна делать то, что вы хотите. Но проблема заключается в том, что на собрании есть какой-либо участник, которого вы не любите. Затем ваш пункт where не работает. Ошибка Participants_FK = @participantID, потому что участники не совпадают. Ошибка Participants_FK is null, потому что столбец всегда имеет значение - только несоответствующие.

Итак, ваш запрос получает либо собрания без участников, либо встречи с вашим идентификатором участника; он отфильтровывает все остальное.

И, наконец, если вы хотите получить информацию о Meetings, то вам, вероятно, следует использовать EXISTS вместо LEFT JOIN.

+0

Спасибо за ваш быстрый ответ, он решил мою проблему. Мне нужно левое соединение, потому что если значение равно null, я динамически изменяю поведение страницы. Я также благодарен за объяснение, это информативно! Я отвечу, как только позволю. – Serban

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