sql - 右表最后一项条件的 SQL 连接
问题描述
对不起,如果标题不是很容易理解,我什至很难表达它!
为简化起见,我在 SQL Server 2012 数据库中有两个表:一个包含请求,另一个包含与这些请求相关的操作(来自服务管理器软件)
Table REQUESTS Table ACTIONS
+------+-------+---+ +---------+------+--------+
|Req_ID|RFC_Num|...| |Action_ID|Req_ID|Group_ID|
+------+-------+---+ +---------+------+--------+
| 1 | I01 |...| | a | 1 | 10 |
| 2 | I02 |...| | b | 1 | 20 |
| 3 | I03 |...| | c | 1 | 38 |
| 4 | I04 |...| | d | 1 | 38 |
+------+-------+---+ | e | 2 | 10 |
| f | 2 | 38 |
| g | 2 | 20 |
| h | 3 | 38 |
| i | 4 | 10 |
+---------+------+--------+
我希望能够选择该请求的最后一个操作具有 group_id = 38 的所有请求,因此它应该返回 req_id 为 1 和 3 的请求,但不是 req2,因为最后一个操作是由另一个组而不是 38 或 req4 作为第 38 组不参与。
我试过像
select *
from REQUEST r
inner join ACTION a
on (
(r.REQUEST_ID = a.REQUEST_ID)
and (select group_id
from ACTION a2
where a2.action_id = a.action_id
).GROUP_ID = 38
)
但我不知道如何放置“max(action_id)”(或按 desc 顺序选择前 1 个),而且我真的不明白如何使用诸如拥有之类的东西。
我也尝试过这样的请求:
select *
from REQUEST r
inner join ACTION a
on (
(r.REQUEST_ID = a.REQUEST_ID)
and (select top 1 a2.action_id, a2.group_id
from ACTION a2
where a2.action_id = a.action_id
group by a2.ACTION_ID
order by a2.action_id desc
).GROUP_ID = 38
)
但我得到这两个错误:
消息 8120,级别 16,状态 1,第 6
行列 ACTION.GROUP_ID 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。Msg 116, Level 16, State 1, Line 11
当 EXISTS 没有引入子查询时,选择列表中只能指定一个表达式。
谢谢你的帮助!
解决方案
您的查询看起来比它需要的要长。试试这个:
SELECT *
FROM requests r
WHERE (
SELECT TOP 1 Group_ID
FROM actions
WHERE Req_ID = r.Req_ID
ORDER BY Action_ID DESC
) = 38
推荐阅读
- configuration - 无法使用 MySQL、SHA256 密码哈希算法、在 Base64 字符串中加盐来配置 Apache Shiro
- html - CSS中的可变“固定”宽度点?
- c# - 如何将类中的枚举值与 main 中的信息进行比较?
- c++ - 分形树 - 未绘制分支
- c# - 无法将列表中的元素设置为 true
- java - ping java 函数的结果
- python - 作业不是由 APScheduler 的 BackgroundScheduler 执行的
- javascript - AWS 无服务器和 javascript - 安全吗?
- android - 获取 Android SDK 的最快、最省事的方法
- java - NIFI:未找到适用于此属性的控制器服务类型