在一个查询中返回同一表中两个不同记录的部分

时间:2009-05-01 10:45:04

标签: sql ms-access

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

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

Job   Status  Open date   Close date
1      Closed   04/29/2009   04/30/2009
2      Open     04/30/2009  
3      Open     04/30/2009  

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

ID  Job   Type    Date       Text
1    1     Open     04/29/2009   Please fix my printer
2    1     Close    04/30/2009   Printer fixed
3    2     Open     04/30/2009   Please fix my monitor
4    2     Update   04/30/2009   Part required
5    3     Open     05/01/2009   Please fix my mouse

每个作业都有一个“打开”注释,可选择一个或多个“更新”注释,以及可选的“关闭”注释。在工作领域显然存在一对多的关系。

我想要的是一个单一的查询,它返回一个作业列表,开放日期,开场记录,如果有的话,还有结束记录,如下所示:

Job   Status  Open date   Open note             Close note
1      Closed   04/29/2009   Please fix my printer    Printer fixed
2      Open     04/30/2009   Please fix my monitor
3      Open     04/30/2009   Please fix my mouse

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

Job   Status  Open date   Open note             Close note
1      Closed   04/29/2009   Please fix my printer
1      Closed   04/29/2009                            Printer fixed
2      Open     04/30/2009   Please fix my monitor
2      Open     04/30/2009   
3      Open     05/01/2009   Please fix my mouse
3      Open     05/01/2009   

..或:

Job   Status  Open date   Open note             Close note
1      Closed   04/29/2009   Please fix my printer
1      Closed   04/29/2009                            Printer fixed
2      Open     04/30/2009   Please fix my monitor
3      Open     05/01/2009   Please fix my mouse

我在Access 2003中使用SQL,虽然最终的查询将来自Excel前端的ADO,但我现在只是试图从Access内部开始工作。

3 个答案:

答案 0 :(得分:7)

1800信息说了什么,但如果没有谓词将联接限制为打开和关闭的笔记,那将无法正常工作:

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');

答案 1 :(得分:0)

基本上,您需要使用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

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

答案 2 :(得分:0)

当我在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找到的其他任何人一样受益。