【问题标题】:ASP: Subquery returned more than 1 valueASP:子查询返回超过 1 个值
【发布时间】:2014-03-03 15:55:31
【问题描述】:

我有一个本地托管的网站,带有一个 MS SQL Server 数据库。我正在尝试从数据库中填充记录列表,但查询返回错误。

asp网页上的代码:

dim sRegID

sRegID = Request.QueryString("RegistrantID")
sSQL = "select CourseID, CourseSectionID, RegistrationID, RegistrantCourseID,AmountDeferred,PaymentType,  DateSubmitted, (select TransactionID  from qryRegistrantCoursePayment where RegistrantCourseID = qryRegistrantCoursedetail.RegistrantCourseID) as TransactionID, (select PaymentID  from qryRegistrantCoursePayment where RegistrantCourseID = qryRegistrantCoursedetail.RegistrantCourseID) as PaymentID from qryRegistrantCourseDetail where RegistrationStatus in ('D') and RegistrantID = " & sRegID & " and AmountDeferred > 0  order by DateSubmitted"
Set rs = objconn.execute(sSQL)

错误信息:

Microsoft OLE DB Provider for SQL Server 错误“80004005”

子查询返回超过 1 个值。这是不允许的,当 子查询遵循 =、!=、、>= 或当子查询用作 一个表达式。

有人可以帮我解决这个问题吗?我在查询写作方面不是很有经验。提前致谢。 :)


好的,查询已通过连接修复...但现在 asp 正在运行。

Else
Response.Write "<table border=1 cellpadding=3 cellspacing=0>"
Response.write "<tr>"
Response.Write "<td>" & "<a href=""javascript:pick('','','','','','','','','')"">" & "None Selected" & "</a></td>"
Response.write "</tr>"
Do Until rs.eof

 Response.Write "<tr>"
 'Response.Write "<td>" & "<a href=""javascript:pick('" & trim(rs("BLDG_CD")) & "')'>" & trim(rs("AC_Title")) & "</a></td>"
 Response.Write "<td>" & "<a href=""javascript:pick(" & quote(trim(rs("q.RegistrationID"))) & "," & quote(trim(rs("q.RegistrantCourseID"))) & "," & quote(trim(rs("q.CourseID"))) & "," & quote(trim(rs("q.CourseSectionID"))) & "," & quote(trim(rs("x.PaymentID"))) & "," & quote(trim(rs("q.AmountDeferred"))) & "," & quote(trim(rs("q.PaymentType"))) & "," & quote(formatdatetime(trim(  rs("q.DateSubmitted") ),2)) & ",'" &  trim("" & rs("x.TransactionID")) & "')"">" & formatcurrency(0 & rs("q.AmountDeferred"))& "</a></td>"
 Response.Write "</tr>"

错误信息:

ADODB.Recordset 错误 '800a0cc1'

在与请求对应的集合中找不到项目 名称或序号。

我无法理解为什么错误是 ADODB 而我使用过

Set rs =objconn.execute(sSQL)

再次感谢您提供的任何帮助。

【问题讨论】:

    标签: sql database subquery


    【解决方案1】:

    根据错误消息,(select TransactionID ...(select PaymentID ... 两个子查询返回不止一行(例如,您的数据模型允许每位注册者在每门课程中多次付款?)。

    虽然您可以通过引入带有TOP 1 的子查询来解决此问题,但最好确定数据为何不符合您的预期:

    另外,由于两个子查询使用相同的谓词作用于同一张表,因此您可以将子查询更改为派生表并加入到该表中:

    select
      CourseID, 
      CourseSectionID, 
      RegistrationID, 
      RegistrantCourseID,
      AmountDeferred,
      PaymentType,  
      DateSubmitted, 
      x.TransactionID,
      x.PaymentID
    from qryRegistrantCourseDetail 
        cross apply
        (select TOP 1 TransactionID, PaymentID
         from qryRegistrantCoursePayment
         where RegistrantCourseID = qryRegistrantCoursedetail.RegistrantCourseID
         ) AS x
    where ...
    order by DateSubmitted
    

    如果您解决了子查询返回多行的原因,则可以更改为简单连接:

    inner join qryRegistrantCoursePayment as x
        on x.RegistrantCourseID = qryRegistrantCoursedetail.RegistrantCourseID
    

    SqlFiddle of both queries here

    【讨论】:

    • 谢谢斯图尔特。这是由于一些特殊情况允许超过 1 条记录(特别是 2 条)。如果我需要同时显示两条记录,连接是否有效?如果是,如何修改当前查询?
    • 是的,如果你直接使用JOIN,那么它会返回两条记录。我已经更新了一个显示两者的 SqlFiddle
    • 再次感谢。该查询似乎已解决,但现在 asp 正在运行。 `代码'
    • 再次感谢。该查询似乎已解决,但现在 asp 正在运行。我已经更新了上面的问题......请看一下。 :)
    • 只需从 asp rs("TransactionId") 等中的字段名称中删除别名(q. 和 x.)。SQL 中需要别名来解决歧义,但它不属于结果列名:-D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多