Sql 外部选择获取嵌套选择的第一个结果

Sql 外部选择获取嵌套选择的第一个结果,sql,nested-queries,nested-query,Sql,Nested Queries,Nested Query,我正在尝试获取课程中员工的最后一个操作(状态)为“已注册”的课程 这是所有课程的表 CREATE TABLE course ( id integer primary key, name text ); CREATE TABLE tran ( id integer primary key, nid integer, cid integer, state text ); 这是所有员工的表格, nid=国有化 CREATE TABLE employe

我正在尝试获取课程中员工的最后一个操作(状态)为“已注册”的课程

这是所有课程的表

CREATE TABLE course (
    id integer primary key,
    name text
);
CREATE TABLE tran (
    id integer primary key,
    nid integer,
    cid integer,
    state text
);
这是所有员工的表格, nid=国有化

CREATE TABLE employee (
    id integer primary key,
    nid integer,
    name text
);
这是一个表格,我在其中记录了所有课程中员工的所有行为

CREATE TABLE course (
    id integer primary key,
    name text
);
CREATE TABLE tran (
    id integer primary key,
    nid integer,
    cid integer,
    state text
);
这是我的数据

INSERT INTO course VALUES (1, "c1"); --> required result
INSERT INTO course VALUES (2, "c2");
INSERT INTO course VALUES (3, "c3"); --> required result

INSERT INTO employee VALUES (1, 111, "e1");
INSERT INTO employee VALUES (2, 222, "e2");
INSERT INTO employee VALUES (3, 333, "e3");

INSERT INTO tran VALUES (1, 111, 1, "enrolled"); --> latest action
INSERT INTO tran VALUES (3, 222, 3, "enrolled");
INSERT INTO tran VALUES (4, 222, 3, "rejected");
INSERT INTO tran VALUES (5, 111, 2, "enrolled");
INSERT INTO tran VALUES (6, 111, 2, "withdrawn");
INSERT INTO tran VALUES (7, 111, 3, "enrolled"); --> latest action
我应该得到我在上面标记的行

我可以使用此工具获取每门课程的最新操作

SELECT cid FROM tran AS t1
WHERE t1.id = (
    SELECT MAX(t2.id) FROM tran AS t2
    WHERE t1.nid = 111
    AND t1.cid = t2.cid
)
AND t1.state = "enrolled";

Output: 
1
3
但当我试图用另一个SELECT语句来包装它以获得课程名称时,我只得到第一个

SELECT id, name FROM course AS c
WHERE c.id = (
    SELECT cid FROM tran AS t1
    WHERE t1.id = (
        SELECT MAX(t2.id) FROM tran AS t2
        WHERE t1.nid = 111
        AND t1.cid = t2.cid
    )
    AND t1.state = "enrolled"
);

Output: 
1|c1

乍一看,您可以在操作符中尝试

SELECT id, name FROM course AS c
WHERE c.id IN (
    SELECT cid FROM tran AS t1
    WHERE t1.id = (
        SELECT MAX(t2.id) FROM tran AS t2
        WHERE t1.nid = 111
        AND t1.cid = t2.cid
    )
    AND t1.state = "enrolled"
);

但是,我自己还没有测试过。

有一种方法使用聚合:

select t.nid, t.cid
from tran t
group by t.nid, t.cid
having max(t.id) = max(case when t.state = 'enrolled' then id end);
这将返回员工/课程组合,其中
tran
中的最后一个id是
“已注册”


如果您需要其他信息,可以在其他表中加入
join

您使用的是什么DBMS?请用您实际使用的DBMS标记您的问题。此外,SQL中的文本值通常用单引号括起来,而不是双引号。。。