2010-11-11 103 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