DROP SCHEMA tmp CASCADE;
CREATE SCHEMA tmp ;
SET search_path=tmp;
CREATE TABLE lutser
(id INTEGER NOT NULL
, category INTEGER NOT NULL
);
INSERT INTO lutser(category, id) VALUES
(1,1100) ,(1,1200) ,(1,1300) ,(1,1500)
,(2,2000) ,(2,2100) ,(2,2300) ,(2,2500)
,(1,3500) -- added these
,(2,3500)
;
这些查询构建一个“位掩码” 1类== 1,2类== 2,并添加它们。因此,当两个集合中都存在id时,掩码为3,仅在第一个集合中为1,而仅在第二集合中为2。外部连接+聚合在这里做的伎俩。
--
-- CTE version
--
WITH flags AS (
WITH one AS (SELECT category AS flag , id FROM lutser WHERE category = 1)
, two AS (SELECT category AS flag , id FROM lutser WHERE category = 2)
SELECT COALESCE(one.flag, 0) + COALESCE(two.flag, 0) AS flag
FROM one
FULL OUTER JOIN two ON two.id = one.id
)
SELECT flag, COUNT(*)
FROM flags
GROUP BY flag;
--
-- Non-CTE version
--
SELECT COALESCE(one.flag, 0) + COALESCE(two.flag, 0) AS flags
, COUNT(*)
FROM (
SELECT category AS flag , id
FROM lutser WHERE category = 1
) one
FULL OUTER JOIN (
SELECT category AS flag , id
FROM lutser WHERE category = 2
) two ON two.id = one.id
GROUP BY flags;
结果(这两个查询;-):
flags | count
-------+-------
1 | 4
2 | 4
3 | 1
专家给解答快速:-) – vels4j