是否有一种方法可以编写下面的self查询的优化版本?我正在尝试查找已注销但访问了特定聊天室的用户的用户聊天室会话活动,如下面的示例SQL查询中,进入聊天室1和3并已退出的用户。
DROP TABLE IF EXISTS tbl;
CREATE TABLE tbl (
id BIGSERIAL PRIMARY KEY,
empno INT,
activity VARCHAR(50)
);
INSERT INTO tbl (empno, activity) VALUES
(1, 'logged_in'),
(1, 'chatroom1'),
(1, 'chatroom3'),
(2, 'logged_in'),
(2, 'logged_out'),
(1, 'logged_out'),
(3, 'logged_in'),
(3, 'chatroom5');
Select t1.* from
(Select empno, activity from tbl where activity in ('chatroom1', 'chatroom3')) as t1
JOIN
(Select empno from tbl where activity ='logged_out') as t2
ON
t1.empno = t2.empno我使用PostgreSQL编写了上面的脚本,但我正在寻找一种更好的编写self联接的方法。我想对于Sub查询,我可以使用CTE。
发布于 2017-08-12 01:58:02
还可以使用聚合。如果我理解正确的话:
select empno
from tbl
group by empno
having sum( (activity = 'logged_out')::int ) > 0 and
sum( (activity = 'chatroom1')::int ) > 0 and
sum( (activity = 'chatroom3')::int ) > 0;如果你的意思是聊天室而不是两者兼而有之,我会用:
having sum( (activity = 'logged_out')::int ) > 0 and
sum( (activity in ('chatroom1', 'chatroom3') )::int ) > 0 发布于 2017-08-12 00:08:19
您可以使用以下查询:
SELECT t1.*
FROM tbl t1 JOIN tbl t2 ON t1.empno = t2.empno
WHERE t1.activity IN ('chatroom1', 'chatroom3')
AND t2.activity ='logged_out';https://stackoverflow.com/questions/45645270
复制相似问题