Sql Access查询神秘地忽略记录
我有一个MS Access联系人和通信数据库,包括一个“联系人”表(姓名、电话、电子邮件等)和一个“呼叫”表(联系人、传入/传出、时间、介质、备注等)。这些表在Contacts.ID=Calls.Contact上链接 例如:Sql Access查询神秘地忽略记录,sql,ms-access,Sql,Ms Access,我有一个MS Access联系人和通信数据库,包括一个“联系人”表(姓名、电话、电子邮件等)和一个“呼叫”表(联系人、传入/传出、时间、介质、备注等)。这些表在Contacts.ID=Calls.Contact上链接 例如: NAME NUMBER EMAIL Michaelangelo 123-4567 M@TMNT.com Donatelo 123-4567 d@TMNT.com Leonardo 123-4567
NAME NUMBER EMAIL
Michaelangelo 123-4567 M@TMNT.com
Donatelo 123-4567 d@TMNT.com
Leonardo 123-4567 L@TMNT.com
Raphael 123-4567 R@TMNT.com
CONTACT TIME IN/OUT
Michaelangelo 1/1/2019 Outgoing
Michaelangelo 1/15/2019 Incoming
Michaelangelo 2/1/2019 Outgoing
Michaelangelo 3/1/2019 Outgoing
Leonardo 1/1/2019 Outgoing
Leonardo 2/1/2019 Outgoing
Michaelangelo 3/15/2019 Incoming
我正试图构建一个查询来报告所有联系人信息(就像直接打开表一样),但有一个字段显示最近的传入和传出通信
因此,对于上述数据:
NAME LAST OUT LAST IN NUMBER EMAIL
Michaelangelo 3/1/2019 3/15/2019 123-4567 M@TMNT.com
Donatelo 123-4567 d@TMNT.com
Leonardo 2/1/2019 123-4567 L@TMNT.com
Raphael 123-4567 R@TMNT.com
因此,结果将独立地识别传入和传出类型的通信记录的最新日期,并在尚未存在此类通信类型的地方返回[nulls]
我有一个查询,大部分是有效的。然而,它似乎神秘地忽略了某些“调用”中没有记录的记录。请注意,并非所有这些记录
我现有的有问题的代码如下所示。我还尝试在连接中移动WHERE语句(在启用之前);我已尝试通过调用打开WHERE语句。时间为NULL或调用\u 1。时间为NULL或…
,以及WHERE语句的其他几个版本
以下是现有的查询:
SELECT Contacts.Name_First, Contacts.Name_Last, Max(Calls.Time) AS [Last Incoming], Max(Calls_1.Time) AS [Last Outgoing]
FROM (Contacts
LEFT OUTER JOIN Calls AS Calls_1 ON Contacts.ID = Calls_1.Contact )
LEFT OUTER JOIN Calls ON Contacts.ID = Calls.Contact
WHERE (
(((Calls.Outgoing_Incoming)="Incoming") OR Calls.Outgoing_Incoming IS NULL)
AND
(((Calls_1.Outgoing_Incoming)="Outgoing") OR Calls_1.Outgoing_Incoming IS NULL)
)
GROUP BY Contacts.Name_First, Contacts.Name_Last;
完整的“联系人”表有361条记录。预期结果是将返回所有361条记录,无论它们是否在“调用”中有相应的记录
事实上,只返回了208条记录。其中许多没有相应的“调用”记录,告诉我OR NULL语句正在工作,至少部分是这样。我找不到省略的记录与返回的记录之间有任何一致的区别。在执行联接之前进行聚合。那么您只需要聚合一次:
SELECT c.Name_First, c.Name_Last, ca.Last_Incoming, ca.Last_Outgoing
FROM Contacts as c LEFT OUTER JOIN
(SELECT Contact,
MAX(IIF(Outgoing_Incoming IS NULL OR Outgoing_Incoming = "Incoming", Time, NULL)) as Last_Incoming,
MAX(IIF(Outgoing_Incoming IS NULL OR Outgoing_Incoming = "Outgoing", Time, NULL)) as Last_Outgoing,
FROM Calls
GROUP BY Contact
) as ca
ON c.ID = c.Contact ;
示例数据、期望的结果以及对查询应该做什么的解释都会有所帮助。谢谢@GordonLinoff,done。