2010-11-11 57 views
1

我是sql新手,請耐心等待。 我有兩個表,COURSES和RESPONSES有一個共同的字段userID。我正在製作一個網格視圖,它顯示COURSES表中的每個用戶可用courseName和RESPONSE表中的dateTaken。所以,我只是寫了查詢爲:從多個表中選擇值

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" /> 

響應表可能會或可能不會有用戶響應的記錄,因此有可能是一個特定的用戶ID沒有記錄。

無論如何,我必須在我的網格視圖中顯示COURSES表中的任何couseName,而不管它在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子句? – 2010-11-11 16:10:30

+0

,因爲他們在原來的查詢中有?試圖儘可能簡單地將其放入。沒有數據在我面前,並假設它有一些價值,而不是過濾器來模擬連接,我保留它。如果沒有必要,OP可以刪除它。 – 2010-11-11 16:18:12

+0

感謝您的快速回復。還有一件事,RESPONSE表可能有重複的條目。我知道我可以使用DISTINCT,但那是整個表格。我如何使用RESPONSE表中的不同值,以便從RESPONSE中只選擇一條記錄。 – Ratan 2010-11-11 16:55:33

1

您所描述的是從課程到響應的左連接。給所有課程,顯示相關的反應,如果它的存在,否則返回null

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

感謝您的快速回復。還有一件事,RESPONSE表可能有重複的條目。我知道我可以使用DISTINCT,但那是整個表格。我如何使用RESPONSE表中的不同值,以便從RESPONSE中只選擇一條記錄。 – Ratan 2010-11-11 18:49:24