【问题标题】:Return parts of two different records from same table in one query在一个查询中从同一个表中返回两条不同记录的部分
【发布时间】:2009-05-01 10:45:04
【问题描述】:

虽然实际的架构有点复杂,但我应该更容易理解以下内容。

在一张表中,我有一份工作清单:

职位状态开放日期关闭日期 1 关闭 04/29/2009 04/30/2009 2 打开 04/30/2009 3 打开 04/30/2009

..在另一个我有一个与工作相关的笔记列表:

ID 作业类型日期文本 1 1 打开 04/29/2009 请修理我的打印机 2 1 关闭 04/30/2009 打印机已修复 3 2 打开 04/30/2009 请修理我的显示器 4 2 更新 04/30/2009 需要零件 5 3 打开 05/01/2009 请修复我的鼠标

每个作业都会有一个“打开”注释,可选的一个或多个“更新”注释,以及一个可选的“关闭”注释。 Job 字段显然是一对多的关系。

我想要的是一个单一的查询,它返回一个工作列表、开放日期、开放注释和结束注释(如果存在),如下所示:

职位状态 打开日期 打开备注 关闭备注 1 已关闭 04/29/2009 请修复我的打印机 打印机已修复 2 打开 04/30/2009 请修理我的显示器 3 打开 04/30/2009 请修复我的鼠标

我这样做的尝试总是失败,因为我最终得到以下结果:

职位状态 打开日期 打开备注 关闭备注 1 关闭 04/29/2009 请修理我的打印机 1 关闭 04/29/2009 打印机已修复 2 打开 04/30/2009 请修理我的显示器 2 打开 04/30/2009 3 打开 05/01/2009 请修复我的鼠标 3 打开 05/01/2009

..或:

职位状态 打开日期 打开备注 关闭备注 1 关闭 04/29/2009 请修理我的打印机 1 关闭 04/29/2009 打印机已修复 2 打开 04/30/2009 请修理我的显示器 3 打开 05/01/2009 请修复我的鼠标

我在 Access 2003 中使用 SQL,虽然最终查询将来自 Excel 前端通过 ADO,但我现在只是试图在 Access 中实现此功能。

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

    1800 Information 所说的,但是如果没有谓词来分别限制连接到打开和关闭的笔记,那将无法正常工作:

    select a.job, a.status, a.opendate, 
           b.note as opennote, c.note as closenote 
    from job a
         join note b on (a.job = b.job and b.type = 'Open')
         left outer join note c on (a.job = c.job and c.type = 'Closed');
    

    【讨论】:

    • 漂亮,这可以很好地适应我的真实示例。
    • 是的,它发生了。在我注意到之前我什至不会回答。
    【解决方案2】:

    基本上你需要使用 Job 表作为查询的驱动表,然后有两个连接到 Note 表。第一个连接是“打开”笔记的内部连接 ​​- 这是一个内部连接,因为总会有一个打开的笔记。第二个连接是“关闭”注释的外部连接,因为可能没有关闭注释。像这样的:

    select job.job, status, opendate, opennote.note, closenote.note from
      job left inner join note opennote on opennote.job = job.job
          left outer join note closenote on closenote.job = job.job
    

    可能访问中的语法略有不同或有很大不同,但这是一般的想法。

    【讨论】:

      【解决方案3】:

      当我在 Access 中创建命令时,tpdi 建议的解决方案有效,但是当我尝试编辑它或通过 Excel 中的 ADODB 运行查询时抛出“不支持连接表达式”摇摆器。

      关闭 MDB 并重新打开就足以让我再次运行它,但是一旦我尝试在 SQL 或 QBE 视图中查看/编辑它,它就会开始抛出异常。最终,即使在“压缩和修复”之后,我也无法打开或编辑查询 - 可能是 Access 内部的某种内部损坏。

      但奇怪的是,我能够通过引用查询 (SELECT * FROM noteReport;) 让它工作 - 奇怪。看来我最初的成功是侥幸,因为我无法重新创建确切的查询并让它再次工作。

      但是,我最终能够使用以下内容复制所需的报告:

      SELECT a.callReference, b.callPriority, datevalue(INT(a.openedDT)),
        b.callerFirstName & ' ' & b.callerSurname AS Caller, c.noteText, d.noteText 
      FROM ((tblMain AS a 
        INNER JOIN tblCalldetails AS b ON a.callreference=b.callReference) 
        LEFT JOIN tblNotes AS c ON a.callReference=c.callReference) 
        LEFT JOIN tblNotes AS d ON a. callReference =d.callReference
      WHERE a.status = 'Closed' 
        AND c.noteType='Open' 
        AND d.noteType='Closing' 
        AND INT(a.closedDT) = #5/1/2009#;
      

      在此发布此内容是为了我和其他任何可能通过 Google 找到此内容的人的利益。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多