我是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" />
RESPONSE表可能有也可能没有用户响应的记录,因此可能没有特定用户ID的记录。
在任何情况下,我都必须在我的网格视图中显示COURSES表中的任何couseName,而不管它在RESPONSE表中的值。如果RESPONSE表没有该用户的记录,那么网格视图将只显示空白或为dateTaken列显示“Not Taken Yet”。如果RESPONSE表中没有记录,我上面的查询根本不显示任何内容。 请帮忙。
谢谢!
答案 0 :(得分:1)
您所描述的是从课程到回复的左连接。给出所有课程,如果在那里显示相关的响应,否则为null
SELECT c.*, r.*
FROM COURSES c LEFT JOIN RESPONSE r
ON c.userID = r.userID
答案 1 :(得分:1)
您正在寻找的是LEFT OUTER JOIN。如果存在信息,这允许第二个表包含在查询中,否则引用的列将返回NULL值。
SELECT c.*, r.*
FROM COURSES c
LEFT JOIN RESPONSE r
ON r.userID = c.userID
WHERE r.userResponse = NULL
检查内部连接和左/右修改器。