首页 > 解决方案 > 右表最后一项条件的 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 没有引入子查询时,选择列表中只能指定一个表达式。

谢谢你的帮助!

标签: sqlsql-serverjoin

解决方案


您的查询看起来比它需要的要长。试试这个:

SELECT *
FROM requests r
WHERE (
    SELECT TOP 1 Group_ID
    FROM actions
    WHERE Req_ID = r.Req_ID
    ORDER BY Action_ID DESC
) = 38

SQL小提琴


推荐阅读