首页 > 解决方案 > 两个表 - 从其中一个表中为第二个表中的每一行选择 TOP

问题描述

我有一个使用两个表格的报告。

tblContacts
tblCalls
我想tblCallstblContacts. 我不完全确定如何去做。我尝试使用 JOINS,但在逻辑上对我有意义的唯一方法是我收到一个错误,告诉我这是一个模棱两可的 OUTER JOIN。所以我尝试做两个不同的查询来完成这个,最后,它仍然只为两个表拉到了 TOP 1,所以我不完全确定我哪里出错了。

我尝试了许多不同的 SQL 语句,尽管它不起作用,但这是我迄今为止“最接近的”(TOP 1 根本不起作用):

SELECT tblCalls.ID, tblCalls.[Call Time], tblCalls.NextContact, tblCalls.Subject, tblCalls.Notes, [First Name] & " " & [Last Name] AS FullName, tblContacts.[Mobile Phone], tblContacts.[Home Phone], tblContacts.[E-mail Address]
FROM tblCalls INNER JOIN tblContacts ON tblCalls.Contact = tblContacts.ID
GROUP BY tblCalls.ID, tblCalls.[Call Time], tblCalls.NextContact, tblCalls.Subject, tblCalls.Notes, [First Name] & " " & [Last Name], tblContacts.[Mobile Phone], tblContacts.[Home Phone], tblContacts.[E-mail Address];

这显示了 中的所有通话记录tblCalls。当我调整查询以显示 TOP 1 时,显然总共只显示了一条记录。

此外,以防万一这成为一个问题,我添加了一个“存档”列tblContacts,那些被指定为“真”的记录根本不会在此报告中列出。这部分应该很容易,但以防万一以后可能会破坏某些东西,我想我会将它添加到问题中。

谢谢!

标签: sqlms-access

解决方案


获得每个联系人最后一次通话的一种方法是NOT EXISTS

SELECT c.* FROM tblCalls c
WHERE NOT EXISTS(
  SELECT 1 FROM tblCalls cc
  WHERE cc.Contact = c.Contact AND cc.[Call Time] > c.[Call Time]
)

所以你可以将它加入到表中:

SELECT
  c.ID, c.[Call Time], c.NextContact, c.Subject, c.Notes, 
  t.[First Name] & " " & t.[Last Name] AS FullName, 
  t.[Mobile Phone], t.[Home Phone], t.[E-mail Address] 
FROM tblContacts t LEFT JOIN (
  SELECT c.* FROM tblCalls c
  WHERE NOT EXISTS(
    SELECT 1 FROM tblCalls cc
    WHERE cc.Contact = c.Contact AND cc.[Call Time] > c.[Call Time]
  )
) c ON c.Contact = t.ID

推荐阅读