虽然实际架构有点复杂,但以下内容对我来说应该更容易理解。
在一张桌子中,我有一份工作清单:
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内部开始工作。
答案 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找到的其他任何人一样受益。