簡體   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