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中的文本值通常用单引号括起来,而不是双引号。。。