2016-12-12 274 views
-1

所以这里是我的代码如下。子查询返回多于1行?

qry = "SELECT * FROM `tblsubjects` WHERE `GRADELEVEL` = " & lblgrade.Text & " AND `SUBJECTNAME` <> (SELECT `SUBJECTNAME` FROM `tblschedule` WHERE `SECTIONNAME` = '" & lblsect.Text & "')" 

它来自may vb应用程序。我认为错误来自查询。我正在制定一个调度系统。在那个查询中,我试图加载尚未在该级别上安排的主题,并将该部分加载到组合框上。但是当我尝试在本节中添加更多时间表时,出现此错误。

enter image description here 这是我对这个功能整个代码:

Private Sub subjectload() 
     con = New MySqlConnection 
     con.ConnectionString = "server=localhost;user id=root;password='';database=kccbeslis" 
     If DataGridView.Rows.Count > 0 Then 
      Try 
       con.Open() 
       qry = "SELECT * FROM `tblsubjects` WHERE `GRADELEVEL` = " & lblgrade.Text & " AND `SUBJECTNAME` <> (SELECT `SUBJECTNAME` FROM `tblschedule` WHERE `SECTIONNAME` = '" & lblsect.Text & "')" 
       cmd = New MySqlCommand(qry, con) 
       rdr = cmd.ExecuteReader 
       While rdr.Read 
        Dim subname = rdr.GetString("SUBJECTNAME") 
        cbsubject.Items.Add(subname) 
       End While 
       con.Close() 
      Catch ex As Exception 
       MessageBox.Show(ErrorToString) 
      End Try 
     Else 
      Try 
       con.Open() 
       qry = "SELECT * FROM `tblsubjects` WHERE `GRADELEVEL` = " & lblgrade.Text & "" 
       cmd = New MySqlCommand(qry, con) 
       rdr = cmd.ExecuteReader 
       While rdr.Read 
        Dim subname = rdr.GetString("SUBJECTNAME") 
        cbsubject.Items.Add(subname) 
       End While 
       con.Close() 
      Catch ex As Exception 
       MessageBox.Show(ErrorToString) 
      End Try 
     End If 
    End Sub 

帮我请!

+0

最有可能的是,您只需要用'NOT IN'替换'<>'。 – Uueerdo

+0

尝试在您的MS SQL子查询中使用TOP 1,感谢很多先生,对于mysql –

回答

0

它出现你的子选择(选择主题名从tblscheduler其中..)有多个与您提供的'sectionname'具有相同的计划,因此返回多个行。

您确定您的sectionname列是每个tblschedule条目唯一的吗?尝试一个计数和分组来看看你是否有多个记录;

SELECT COUNT(*) FROM tblschedule GROUP BY sectionname; 

如果您需要多行,您可以尝试用NOT IN替换<>。

+0

谢谢。我会试试这个。 – user3397424

+0

谢谢你,先生很多。当我替换<>到NOT IN错误不显示。非常感谢在我的问题上的快速反应。 :) – user3397424

0

是的,这会导致您的子查询返回多个记录,并且<>运算符需要标量值和值列表。你还是使用NOT IN运营商像

AND `SUBJECTNAME` NOT IN (SELECT `SUBJECTNAME` FROM `tblschedule` WHERE `SECTIONNAME` = '" & lblsect.Text & "') 

顺便说一句,你知道你的发布代码是非常脆弱的SQL注入。您应该考虑使用参数化查询以避免相同。

+0

使用limit = 1。好吧,先生,我会尝试搜索有关参数化的查询。再次感谢。 – user3397424

0

使用NOT IN代替<>

QRY = “SELECT * FROM tblsubjects WHERE GRADELEVEL =” & lblgrade.Text & “和主旨名称NOT IN(SELECT主旨名称FROM tblschedule WHERE SECTIONNAME =“” & lblsect.Text & “')”

+0

感谢您的快速响应先生。你们对我的论文有很大的帮助。非常感谢你。! – user3397424

1

子查询SELECT主旨名称FROM tblschedule WHERE SECTIONNAME = '" & lblsect.Text & "'效果比1点的记录多。您正在使用<>而不是不使用,使用Not In子句并尝试。