2010-11-11 3 views
1

Я новичок в sql, поэтому, пожалуйста, несите меня здесь. У меня есть две таблицы, COURSES и RESPONSES, которые имеют общий идентификатор пользователя. Я создаю сетку, которая отображает каждое доступное имя пользователя из таблицы COURSES и dateTaken из таблицы RESPONSE. Так что я просто написал запрос как:Выбор значений из нескольких таблиц

SELECT c.*, r.* 
FROM COURSES c, RESPONSE r 
WHERE c.userID = @userID1 and r.userID = @userID1 and r.userResponse = NULL 

<SelectParameters> 
    <asp:Parameter Name="userID1" Type="Int32" /> 
</SelectParameters> 
<asp:GridView 
      ID      ="gvAvailCourses" 
      runat     ="server" 
      DataSourceID   ="sdsAvailCourses" 
      Width     ="100%" 
      DataKeyNames   ="trainingCourseID" 
      PageSize    ="10" 
      AllowPaging    ="true" 
      EnablePersistedSelection="true" 
      OnRowCommand   ="gvAvailCourses_RowCommand" 
      AutoGenerateColumns  ="false"> 


      <Columns> 

       <asp:BoundField DataField="trainingCourseID" HeaderText="Coursen ID" /> 
       <asp:ButtonField ButtonType="Link" DataTextField="CourseName" CommandName="CourseName" HeaderText="Course Name" /> 
       <asp:BoundField DataField="dateEntered" HeaderText="Last Taken" /> 

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

В любом случае, я должен отображать в своем виде сетки любое имя couseName, которое находится в таблице COURSES, независимо от его значения в таблице RESPONSE. Если таблица RESPONSE не имеет записи для этого пользователя, тогда вид сетки будет просто отображаться там или сказать «Не принято» для столбца dateTaken. Мой предыдущий запрос ничего не отображает, если в таблице RESPONSE нет записи. Пожалуйста, помогите.

Спасибо!

ответ

1

Что вы ищете является LEFT OUTER JOIN. Это позволяет включить вторую таблицу в запрос, если имеется информация, иначе ссылочные столбцы возвращают значения NULL.

SELECT   c.*, r.* 
FROM COURSES c 
    LEFT JOIN  RESPONSE r 
    ON   r.userID = c.userID 
WHERE   r.userResponse = NULL 

Проверьте внутренние соединения и их модификаторы влево/вправо.

+0

почему предложение where? –

+0

потому что у них было это в исходном запросе? Попытка бросить его как можно проще. Не имея данных передо мной и предполагая, что у него есть какое-то значение, кроме фильтра для имитации соединения, я его удерживал. Если нет необходимости, OP мог бы просто удалить его. –

+0

Благодарим за быстрый ответ. Еще одна вещь, что таблица RESPONSE может иметь повторяющиеся записи. Я знаю, что я могу использовать DISTINCT для этого, но тогда это для всей таблицы. Как использовать различие только для таблицы RESPONSE, так что из RESPONSE выбрана только одна запись. – Ratan

1

То, что вы описываете, - это левое соединение от курсов к ответу. Дайте все курсы, показать соответствующий ответ, если его там, в противном случае нулевого

SELECT c.*, r.* 
FROM COURSES c LEFT JOIN RESPONSE r 
ON c.userID = r.userID 
+0

Благодарим за быстрый ответ. Еще одна вещь, что таблица RESPONSE может иметь повторяющиеся записи. Я знаю, что я могу использовать DISTINCT для этого, но тогда это для всей таблицы. Как использовать различие только для таблицы RESPONSE, так что из RESPONSE выбрана только одна запись. – Ratan

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