2009-05-01 52 views
1

虽然实际的模式有点复杂,但下面应该对我来说更容易一些。在一个查询中返回来自同一个表的两个不同记录的部分

在一个表我的工作清单:

 
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字段显然有一对多的关系。

我想吃点什么是返回的工作列表,开放日,开放笔记和,如果存在的话,闭注,像这样一个查询:

 
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 

我使用SQL在艾策斯s 2003,尽管最终的查询将通过ADO从Excel前端查询,但我现在只想从Access中获取此工作。

回答

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

美丽,这很好地适合我的现实生活中的例子。 – Lunatik 2009-05-01 11:15:55

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 

也许访问语法稍微或大不相同,但这是一般的想法。

0

当我创建的命令由tpdi提出的解决方案工作Access,但是当我尝试编辑它时抛出了“不支持连接的表达式”的晃动,或者通过Excel中的ADODB运行查询。

关闭MDB并重新打开足以让我再次运行它,但只要我试图在SQL或QBE视图中查看/编辑它,它就会开始抛出异常。最终,我无法打开或编辑查询,即使在“紧凑的&修复”之后 - 大概是某种内部腐败的问题。

奇怪的是,我能够通过引用查询(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#; 

张贴这在这里不亚于我为任何其他人可以通过谷歌找到这样做的好处。

相关问题