sql - 两个表 - 从其中一个表中为第二个表中的每一行选择 TOP
问题描述
我有一个使用两个表格的报告。
tblContacts
tblCalls
我想tblCalls
从tblContacts
. 我不完全确定如何去做。我尝试使用 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
,那些被指定为“真”的记录根本不会在此报告中列出。这部分应该很容易,但以防万一以后可能会破坏某些东西,我想我会将它添加到问题中。
谢谢!
解决方案
获得每个联系人最后一次通话的一种方法是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
推荐阅读
- c# - Cosmosdb documentdb 带参数的 Sql 查询返回 0 项
- python - 模板匹配多个具有相同模板的图像
- ios - 在圆形路径中动画线形 CAShapeLayer
- java - android相机未打开以捕获图像
- python - 如何在熊猫数据框中对0到1之间的变量进行标准化
- python - 如何正确迭代这个 JSON 字典?
- python - 检查输入时出错:预期 conv2d_1_input 的形状为 (3, 32, 32) 但得到的数组的形状为 (32, 32, 3)
- python - 使用 setuptools 使用 Python 库安装的数据文件位置
- oracle - 如何在 oracle APEX 中杀死任何人会话?
- react-native - Flatlist不在绝对视图内滚动?