在子表中没有记录的“周”之间查询多条记录

Posted

技术标签:

【中文标题】在子表中没有记录的“周”之间查询多条记录【英文标题】:Query multiple records between "Weeks" where no record in child table 【发布时间】:2014-07-01 10:31:34 【问题描述】:

我正在尝试确定如何使用 Access 2013 处理此查询的最佳方法。我有一个包含以下内容的客户表:

clientID    fName    lName    admissionDate    dischargeDate
1            John      Doe        05/06/2014       06/27/2014
2            Jane      Doe        04/24/2014       05/15/2014
3            Steven    Smith      05/15/2014       NULL/Empty
4            Chris     Davis      06/12/2014       NULL/Empty

然后有一个 WeeklyProgressNotes 表格,供负责审核客户图表的人员使用。它不包含实际的每周进度笔记,它只包含一个是/否字段和一个日期字段,表示每周进度笔记完成的日期。如下:

noteID     completed     dateCompleted     clientID
1            yes              05/08/2014          1
2            yes              05/14/2014          1
3            yes              04/25/2014          2

我正在创建一个表单,审核员可以打开该表单以确定她需要在几周内检查每个客户,以查看他们在该周是否完成了每周进度记录。星期从星期一到星期日,如果她还没有检查和确认那一周,那么 WeeklyProgressNotes 表中将没有记录。所以表格基本上是这样的:

fName    lName       week              completed        date      clientID(hidden)
John      Doe       5/19/14-5/25/14    Checkbox          Null        1
John      Doe       5/26/14-6/1/14     Checkbox          Null        1
John      Doe       6/2/14-6/8/14      Checkbox          Null        1
John      Doe       6/9/14-6/15/14     Checkbox          Null        1
John      Doe       6/16/14-6/22/14    Checkbox          Null        1
John      Doe       6/23/14-6/29/14    Checkbox          Null        1
Jane      Doe       4/28/14-5/4/14     Checkbox          Null        2

等等……

我考虑过创建一条 SQL 语句来选择所有客户,然后创建一个函数来确定他们在特定周内的入院日期和在特定周内的出院日期,然后使用另一个 SQL 语句创建一个循环所有周的 BETWEEN 子句,并确定 WeeklyProgressNotes 表中是否存在条目。如果没有,那么我将显示上述信息。我不确定是否有一种更简单、搜索强度更低的方法。也许一个 SQL 查询可以减少一些循环。

【问题讨论】:

【参考方案1】:

我解决这个问题的方法是创建一个新表。由于您想将入院日期和出院日期之间的日期时间拆分为多行,我认为最好将客户端拆分为表中的多条记录。

以下代码基于您的基本客户表创建记录集。之后它会创建您的临时表(由于时间不足,此处仅填充了 2 个字段)。当您遍历原始表格的记录集时,您会保留每一行,并将添加和出院之间的时间分成一周。

之后,一旦您填充了该表,就可以轻松地基于该表和带有每周进度记录的表创建一个简单的查询。

我希望我的解释是足够的,请注意我还没有测试代码。它很可能需要代表您进行一些调整。如果我手头有更多时间,也许我可以稍后再看看。

Sub showrecords()
Dim gvweek As String
Dim rs As Recordset
Dim rstemp As Recordset
Dim tdfNew As TableDef

gvweek = ""

Set tdfNew = CurrentDb.CreateTableDef("Tbl_Temporary")
With tdfNew
    .Fields.Append .CreateField("fName", dbText)
    .Fields.Append .CreateField("week", dbText)
End With

Set rs = CurrentDb.OpenRecordset("Clients")
With rs
    Do Until .EOF
        .MoveFirst
            Do Until DateAdd("dd", 7, ![admissionDate]) > ![dischargeDate]
                gvweek = ![admissionDate] & " - " & DateAdd("dd", 7, ![admissionDate])
                    Set rstemp = CurrentDb.OpenRecordset("Tbl_Temporary")
                        With rstemp
                            .AddNew
                            ![fName] = rs![fName]
                            ![week] = gvweek
                            .Update
                        End With
                    rstemp.Close
                    Set rstemp = Nothing
            Loop
        gvweek = ""
        .MoveNext
    Loop
End With

rs.Close
Set rs = Nothing
DoCmd.DeleteObject acTable, "Tbl_Temporary"
End Sub

【讨论】:

我正在努力实现这一点。我对 VB 样式脚本的体验都与网页设计相关,我从未在 Access 中创建过这样的临时表。我认为我首当其冲的代码将通过所有数据进行排序并创建临时表。现在我试图弄清楚如何访问该临时表并将其字段值用于我的表单中的控制源。有什么额外的想法或方向吗?感谢您的上述回复。我发现它提供了非常丰富的信息和很好的学习体验,因为我以前从未在 Access 中尝试过这样的事情。 您也许可以在每次以编程方式完成后以可视方式创建表并清空它,如果这更适合您的话。请注意,如果表单在创建表格之前打开,您肯定会遇到错误。如果要使用此方法,则必须以编程方式创建查询。您要做的是创建一个 SQL 字符串,其中包含您想要从临时表和每周进度表中获得的信息。然后,您可以打开表单并将查询设置为源代码。谢谢,希望我的回答足够!

以上是关于在子表中没有记录的“周”之间查询多条记录的主要内容,如果未能解决你的问题,请参考以下文章

oracle查询包含在子表中的主表数据

优化联合 sql 查询

SQL 查询多条符合条件的记录

一个开发需求的解决方案 & Oracle 临时表介绍

如果在jsp中删除记录失败,则显示错误消息

在子查询之间的 ORACLE 连接语句中选择顶部记录