繁体   English   中英

两个表-从一个表中的SELECT TOP到第二个表中的每一行

[英]Two tables - SELECT TOP from one of the tables for each row in second table

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

tblContacts
tblCalls
我想拉从TOP 1 tblCalls在每一行tblContacts 我不太确定该怎么做。 我尝试使用JOINS,但从逻辑上讲对我有意义的唯一方法是,我得到一个错误提示,告诉我这是一个模棱两可的OUTER JOIN。 因此,我尝试进行两个不同的查询来完成此操作,最后,它仍然仅将BOTH表的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中的所有Call记录。 当我将查询调整为显示TOP 1时,显然只显示了一条记录。

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

谢谢!

获得每个联系人的最后一个电话的一种方法是使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM