子查询返回的行数超过1行?

时间:2016-12-12 17:50:55

标签: mysql vb.net

所以这是我的代码如下。

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

它来自于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

帮帮我吧!

4 个答案:

答案 0 :(得分:1)

子查询SELECT SUBJECTNAME FROM tblschedule WHERE SECTIONNAME = '" & lblsect.Text & "'会产生超过1条记录。您正在使用&lt;&gt;而不是in,使用Not In子句并尝试。

答案 1 :(得分:0)

是的,这导致您的子查询返回多于1条记录,<>运算符需要标量值和值列表。您应该使用NOT IN运算符

AND `SUBJECTNAME` NOT IN (SELECT `SUBJECTNAME` FROM `tblschedule` WHERE `SECTIONNAME` = '" & lblsect.Text & "')
顺便说一句,你知道你发布的代码非常容易受到 SQL Injection 的攻击。您应该考虑使用参数化查询来避免相同的问题。

答案 2 :(得分:0)

看来你的子选择(SELECT subjectname FROM tblscheduler where ..)有多个时间表,并且具有相同的&#39; sectionname&#39;你提供,因此返回超过1行。

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

   List<cli::array<String^>^>^ ls = gcnew List<cli::array<String^>^>();

您可以尝试替换&lt;&gt;如果你需要多行,请使用NOT IN。

答案 3 :(得分:0)

使用NOT IN而不是&lt;&gt;

qry =&#34; SELECT * FROM tblsubjects WHERE GRADELEVEL =&#34; &安培; lblgrade.Text&amp; &#34; AND SUBJECTNAME NOT IN(选择SUBJECTNAME来自tblschedule,其中SECTIONNAME =&#39;&#34;&amp; lblsect.Text&amp;&#34;&#39;)&#34;