【问题标题】:Dynamic TSQL query with nested looping具有嵌套循环的动态 SQL 查询
【发布时间】:2019-08-02 02:25:19
【问题描述】:

我已经构建了一个使用 SQL Server 作为后端的基于 Intranet 的测验系统。测验分数存储在单独的表格中,每个测验一个。工作人员将只能访问部分或全部测验,具体取决于他们的职位。 我正在尝试确定运行查询的最佳方式,该查询将总计或汇总每个人已完成的测验数量,并将其与分配给他们的预定测验数量进行比较。一旦这两个数字匹配,它们就被认为是完整的,我可以将最终结果导出到另一个数据库。

我尝试使用 VBS 循环遍历测验表并检查每个人的分数,但我似乎无法让它正常工作,因为它有点依赖于循环遍历每个员工记录,然后必须循环再次通过分配给每个的所有表名。我最终循环初始查询而不是辅助查询以获得计数:

Set rs = CreateObject("ADODB.Recordset")
rs.CursorLocation = 3

rs.Open "Select v.emp_num, v.position, p.group_id From ValidApplicants as v, Positions as p Where v.complete = 0 and v.notified = 0 And v.position = p.Position", conn
RSCount = rs.RecordCount

i = 0
Do until i = RSCount
    strempNum = rs("emp_num")
    strPosition = rs("position")
    strGroupID = rs("group_id")

    Set rs2 = CreateObject("ADODB.Recordset")
    rs2.CursorLocation = 3

    rs2.Open "Select quiz_name, tblname, quiz_code From quizfilter Where group_id in (1, "& strGroupID &")",conn
    recCount = rs2.RecordCount

    x = 0
    Do until x = recCount
        strQuizName = rs2("quiz_name")
        strTable = rs2("tblname")
        strCode = rs2("quiz_code")

        Set rez = CreateObject("ADODB.Recordset")
        rez.CursorLocation = 3

        j = 0
        Do until j = recCount
            rez.Open "SELECT (SELECT COUNT(*) FROM "& strTable &" WHERE 
            pass_fail = 1 And employee_num = 7275) AS SumCount"
            j = j + 1
        Loop

        Set rez2 = CreateObject("ADODB.Recordset")
        rez2.CursorLocation = 3
        rez2.Open "Select quiz_count From QuizGroups Where group_id = "& strGroupID &"",conn
        if not (rez2.eof) then
            strQuizCount = rez2("quiz_count")
        end if

        rs2.MoveNext
        x = x + 1
    Loop

    if not users_eof then
        for record=0 to UBound(dataArray,2)
            strtheCount = dataArray(user_score,record)
        Next

        if (strtheCount = strQuizCount) then
            Wscript.Echo "Count is "& strQuizCount &""
        end if
    end if

    rs2.close
    set rs2 = nothing

    rs.MoveNext
    i = i + 1
Loop

如果有人能指出我正确的方向,也许有办法通过 SQL 存储过程中的动态查询来实现这一点?

非常感谢

【问题讨论】:

  • 您的数据库中有一个基本的设计缺陷,您必须首先修复。您有动态表名。不要那样做。代替每个测验单独的表,创建一个名为 quizzes(或类似名称)的表并将列 quiz_code, pass_fail, employee_num 放在那里。在继续处理此问题之前,请先进行更改。
  • 现在也是学习如何使用 ANSI-92 样式连接的时候了,它们已经存在了 25 多年。 sqlblog.org/2009/10/08/bad-habits-to-kick-using-old-style-joins

标签: sql sql-server vbscript adodb


【解决方案1】:

感谢托马拉克的想法, 我设法通过将所有测验分数更新到一个公用表来完成这项工作,我现在可以参考该表来确定每个用户是否完成了所需数量的测验。

感谢您的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    相关资源
    最近更新 更多