我有一个包含两个下拉列表的“查看反馈”页面,用于过滤问题答案的网格视图。第一个ddList是模块,一旦选中,第二个问题清单就会启用,用户可以选择一个问题来查看与所选模块相关的问题,或者他们可以选择查看所有问题的所有答案选定的模块。
如果他们选择了一个问题,我可以使用它,但是如果他们选择了所有问题,我只需要获得所有答案,而不仅仅是所选模块的特定答案。
抱歉,我知道这不是最明确的解释,但任何帮助都会很棒。
我的桌子:
CREATE TABLE tblModules
(
Module_ID nvarchar(10) PRIMARY KEY,
Module_Title nvarchar(MAX) NOT NULL
);
CREATE TABLE tblQuestions
(
Q_ID int PRIMARY KEY IDENTITY(1,1),
Question_Text varchar(1000) NOT NULL
);
CREATE TABLE tblFeedback
(
Submission_ID int PRIMARY KEY IDENTITY(1,1),
Username varchar(100) NOT NULL,
Domain varchar(50) NOT NULL,
DateTime_Submitted datetime NOT NULL
Module_ID nvarchar(10)
FOREIGN KEY (Module_ID) REFERENCES tblModules (Module_ID);
);
CREATE TABLE tblAnswers
(
Q_ID int NOT NULL,
Submission_ID int NOT NULL,
Answer_Text varchar(max),
FOREIGN KEY (Q_ID) REFERENCES tblQuestions(Q_ID),
FOREIGN KEY (Submission_ID) REFERENCES tblFeedback(Submission_ID)
);
这是我用来构造Sql语句的代码片段,用于选择然后绑定到我的网格的数据。
// If they have selected view all questions, get all answers for module
if (ddQuestions.SelectedItem.Value == "all")
{
//selectQuery = "SELECT * FROM tblAnswers ORDER BY Submission_ID";
selective = false;
//gridviewFeedback.Columns[3].Visible = true;
selectQuery = "SELECT * FROM tblAnswers A ";
selectQuery += "WHERE EXISTS (SELECT * FROM tblModules M JOIN tblFeedback F ON M.Module_ID = F.Module_ID ";
selectQuery += "WHERE F.Module_ID = '" + this.selectedModuleID + "')";
}
// Instead, if they have selected a specific question, get the information for the selected module and question
else
{
selectQuery = "SELECT * FROM tblAnswers WHERE Q_ID = '" + qID + "' ORDER BY Submission_ID";
selective = true;
//gridviewFeedback.Columns[3].Visible = false;
}
DataSet objDs = new DataSet();
SqlDataAdapter myCommand2;
myCommand2 = new SqlDataAdapter(selectQuery, myConnection);
myCommand2.SelectCommand.CommandType = CommandType.Text;
myCommand2.Fill(objDs);
gridviewFeedback.DataSource = objDs;
gridviewFeedback.DataBind();
我认为这是我的SQL语句,因为我对SQL不是很有经验,并且编辑了我在其他地方使用过的其他人给我的声明。
UPDATE 刚刚意识到我的另一个声明也没有用 - 它也没有提供模块特定的答案。
答案 0 :(得分:2)
您似乎没有将表A与表M或表F相关联。如果有任何模块或反馈,则会在表A中为所有行提供所提供的模块ID。您需要添加AND语句以将表A与EXISTS子句中的内容相关联。
selectQuery = @"
SELECT * FROM tblAnswers A
WHERE EXISTS (
SELECT * FROM tblModules M
JOIN tblFeedback F ON M.Module_ID = F.Module_ID
WHERE F.Module_ID = @ModuleID
AND A.Submission_ID = F.Submission_ID)";
请考虑使用参数化查询,而不是将变量附加到字符串中。这使SQL Server更有效地使用计划缓存,这更快,并且还消除了SQL注入攻击的可能性。
答案 1 :(得分:1)
请尝试此查询。我认为应该这样做。 这应该可以帮助您获得属于特定模块的所有答案
SELECT ans.* FROM tblAnswers ans, tblFeedback fb
WHERE ans.Submission_ID = fb.Submission_ID
AND fb.Module_ID = 'selected module'