繁体   English   中英

使用SQL执行内部自连接的更好方法是什么?

[英]What is the better way to perform inner self join using SQL?

有没有办法写下面的自我联接查询的优化版本? 我正在尝试查找已注销但访问了特定聊天室的用户的用户聊天室会话活动,例如下面的示例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编写了上述脚本,但我正在寻找一种更好的编写SQL自联接的方法。 我想我可以使用CTE的子查询。

您可以使用以下查询:

SELECT t1.*
FROM tbl t1 JOIN tbl t2 ON t1.empno = t2.empno
WHERE t1.activity IN ('chatroom1', 'chatroom3')
AND t2.activity ='logged_out';

您也可以使用聚合。 如果我正确理解:

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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM